@vue-skuilder/courseware 0.1.33 → 0.1.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CourseWare-BTFRjgBR.js +305 -0
- package/dist/CourseWare-BTFRjgBR.js.map +1 -0
- package/dist/CourseWare-DSeyTAtH.cjs +2 -0
- package/dist/CourseWare-DSeyTAtH.cjs.map +1 -0
- package/dist/assets/CourseWare.css +1 -0
- package/dist/assets/chess.css +1 -0
- package/dist/assets/index.css +1 -1
- package/dist/assets/math.css +1 -0
- package/dist/assets/piano.css +1 -0
- package/dist/assets/sightsing.css +1 -0
- package/dist/assets/typing.css +1 -0
- package/dist/backend.cjs.js +1 -1
- package/dist/backend.cjs.js.map +1 -1
- package/dist/backend.mjs +4 -3
- package/dist/backend.mjs.map +1 -1
- package/dist/chess/components/ChessBoard.vue.d.ts.map +1 -1
- package/dist/chess/composables/useChessgroundBounds.d.ts +24 -0
- package/dist/chess/composables/useChessgroundBounds.d.ts.map +1 -0
- package/dist/chess/questions/puzzle/puzzle.vue.d.ts.map +1 -1
- package/dist/chess-BbHATAzk.js +2949 -0
- package/dist/chess-BbHATAzk.js.map +1 -0
- package/dist/chess-BsgVZARV.cjs +7 -0
- package/dist/chess-BsgVZARV.cjs.map +1 -0
- package/dist/chess-C_2RQEuq.cjs +1 -0
- package/dist/chess-X1bmWmh3.js +3 -0
- package/dist/french-Bxet7hJm.cjs +2 -0
- package/dist/french-Bxet7hJm.cjs.map +1 -0
- package/dist/french-Dk7YG8Td.js +140 -0
- package/dist/french-Dk7YG8Td.js.map +1 -0
- package/dist/french-evUMlbbq.js +3 -0
- package/dist/french-x9P8RRn8.cjs +1 -0
- package/dist/index.cjs.js +2 -170
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +172 -62021
- package/dist/index.mjs.map +1 -1
- package/dist/math-B1oDAkOy.cjs +34 -0
- package/dist/math-B1oDAkOy.cjs.map +1 -0
- package/dist/math-B4HbgYf6.js +13391 -0
- package/dist/math-B4HbgYf6.js.map +1 -0
- package/dist/math-BWlIa6-l.cjs +1 -0
- package/dist/math-DYni7rRl.js +3 -0
- package/dist/piano-BN5Btq91.js +3 -0
- package/dist/piano-Btvkzjfz.cjs +1 -0
- package/dist/piano-CefQUc72.cjs +2 -0
- package/dist/piano-CefQUc72.cjs.map +1 -0
- package/dist/piano-DF1g6yaX.js +3603 -0
- package/dist/piano-DF1g6yaX.js.map +1 -0
- package/dist/pitch-C-lh9ezH.cjs +2 -0
- package/dist/pitch-C-lh9ezH.cjs.map +1 -0
- package/dist/pitch-CgGJFkZ1.js +106 -0
- package/dist/pitch-CgGJFkZ1.js.map +1 -0
- package/dist/pitch-Dn0iNqiS.js +3 -0
- package/dist/pitch-DsopN5IR.cjs +1 -0
- package/dist/{shapes-nszfsx3o.js → shapes-BQUVJdp5.js} +3 -21
- package/dist/shapes-BQUVJdp5.js.map +1 -0
- package/dist/shapes-C_-mvrCc.cjs +2 -0
- package/dist/shapes-C_-mvrCc.cjs.map +1 -0
- package/dist/shapes-DRq8J94A.cjs +2 -0
- package/dist/shapes-DRq8J94A.cjs.map +1 -0
- package/dist/shapes-ICeg46lr.js +25 -0
- package/dist/shapes-ICeg46lr.js.map +1 -0
- package/dist/sightsing-BFQ7HRig.js +41061 -0
- package/dist/sightsing-BFQ7HRig.js.map +1 -0
- package/dist/sightsing-CJX3k0Fd.js +3 -0
- package/dist/sightsing-Cr_SJ5Vc.cjs +133 -0
- package/dist/sightsing-Cr_SJ5Vc.cjs.map +1 -0
- package/dist/sightsing-CtagQ0FJ.cjs +1 -0
- package/dist/typing-BevtfWlp.js +184 -0
- package/dist/typing-BevtfWlp.js.map +1 -0
- package/dist/typing-CBPjtwrg.cjs +1 -0
- package/dist/typing-CK-glKhm.cjs +2 -0
- package/dist/typing-CK-glKhm.cjs.map +1 -0
- package/dist/typing-k-ojjO7G.js +3 -0
- package/dist/word-work-BOnRlZgd.js +108 -0
- package/dist/word-work-BOnRlZgd.js.map +1 -0
- package/dist/word-work-C5MTSapy.cjs +1 -0
- package/dist/word-work-Dd6tIKrt.js +3 -0
- package/dist/word-work-fNbCLNuN.cjs +2 -0
- package/dist/word-work-fNbCLNuN.cjs.map +1 -0
- package/package.json +6 -5
- package/dist/shapes-DJ-ujuDr.cjs +0 -2
- package/dist/shapes-DJ-ujuDr.cjs.map +0 -1
- package/dist/shapes-nszfsx3o.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math-B1oDAkOy.cjs","names":["exports","exports","module"],"sources":["../src/math/questions/addition/horizontal.vue","../src/math/questions/addition/horizontal.vue","../src/math/questions/addition/verbal.vue","../src/math/questions/addition/verbal.vue","../src/math/questions/addition/index.ts","../src/math/questions/division/horizontal.vue","../src/math/questions/division/horizontal.vue","../src/math/questions/division/index.ts","../src/math/questions/multiplication/blorizontal.vue","../src/math/questions/multiplication/blorizontal.vue","../src/math/questions/multiplication/verbal.vue","../src/math/questions/multiplication/verbal.vue","../src/math/questions/multiplication/index.ts","../src/math/questions/equalityTest/trueFalse.vue","../src/math/questions/equalityTest/trueFalse.vue","../src/math/questions/equalityTest/index.ts","../src/math/questions/oneStepEqn/solve.vue","../src/math/questions/oneStepEqn/solve.vue","../src/math/questions/oneStepEqn/index.ts","../src/math/questions/angleCategorize/angleCategorize.vue","../src/math/questions/angleCategorize/angleCategorize.vue","../src/math/questions/angleCategorize/index.ts","../__vite-browser-external","../../../node_modules/acorn/dist/acorn.js","../../../node_modules/paper/dist/paper-full.js","../src/math/questions/supplementaryAngles/supplementaryAngles.vue","../src/math/questions/supplementaryAngles/supplementaryAngles.vue","../src/math/questions/supplementaryAngles/index.ts","../src/math/questions/countBy/default.vue","../src/math/questions/countBy/default.vue","../src/math/questions/countBy/index.ts","../src/math/index.ts"],"sourcesContent":["<template>\n <div data-viewable=\"AdditionHorizontal\">\n <template v-if=\"question\">\n {{ question.a }} + {{ question.b }} =\n <UserInputNumber v-model=\"answer\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport { SingleDigitAdditionQuestion } from './index';\nimport { UserInputNumber, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'AdditionHorizontal',\n\n components: {\n UserInputNumber,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'AdditionHorizontal');\n const questionUtils = useQuestionView<SingleDigitAdditionQuestion>(viewableUtils);\n\n const answer = ref('');\n\n // Initialize question immediately\n questionUtils.question.value = new SingleDigitAdditionQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const submit = () => {\n if (question.value) {\n const isCorrect = question.value.isCorrect(parseInt(answer.value, 10));\n alert(isCorrect);\n }\n };\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question, // expose the computed question directly\n submit,\n };\n },\n});\n</script>\n","<template>\n <div data-viewable=\"AdditionHorizontal\">\n <template v-if=\"question\">\n {{ question.a }} + {{ question.b }} =\n <UserInputNumber v-model=\"answer\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport { SingleDigitAdditionQuestion } from './index';\nimport { UserInputNumber, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'AdditionHorizontal',\n\n components: {\n UserInputNumber,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'AdditionHorizontal');\n const questionUtils = useQuestionView<SingleDigitAdditionQuestion>(viewableUtils);\n\n const answer = ref('');\n\n // Initialize question immediately\n questionUtils.question.value = new SingleDigitAdditionQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const submit = () => {\n if (question.value) {\n const isCorrect = question.value.isCorrect(parseInt(answer.value, 10));\n alert(isCorrect);\n }\n };\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question, // expose the computed question directly\n submit,\n };\n },\n});\n</script>\n","<template>\n <div data-viewable=\"VerbalAddition\">\n <template v-if=\"question\">\n {{ question.a }} plus {{ question.b }} is\n <UserInputNumber v-model=\"answer\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport { SingleDigitAdditionQuestion } from './index';\nimport { UserInputNumber, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'VerbalAddition',\n\n components: {\n UserInputNumber,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'VerbalAddition');\n const questionUtils = useQuestionView<SingleDigitAdditionQuestion>(viewableUtils);\n\n const answer = ref('');\n\n // Initialize question immediately\n questionUtils.question.value = new SingleDigitAdditionQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const submit = () => {\n if (question.value) {\n const isCorrect = question.value.isCorrect(parseInt(answer.value, 10));\n alert(isCorrect);\n }\n };\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n submit,\n };\n },\n});\n</script>\n","<template>\n <div data-viewable=\"VerbalAddition\">\n <template v-if=\"question\">\n {{ question.a }} plus {{ question.b }} is\n <UserInputNumber v-model=\"answer\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport { SingleDigitAdditionQuestion } from './index';\nimport { UserInputNumber, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'VerbalAddition',\n\n components: {\n UserInputNumber,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'VerbalAddition');\n const questionUtils = useQuestionView<SingleDigitAdditionQuestion>(viewableUtils);\n\n const answer = ref('');\n\n // Initialize question immediately\n questionUtils.question.value = new SingleDigitAdditionQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const submit = () => {\n if (question.value) {\n const isCorrect = question.value.isCorrect(parseInt(answer.value, 10));\n alert(isCorrect);\n }\n };\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n submit,\n };\n },\n});\n</script>\n","import { Question, ViewComponent } from '@vue-skuilder/common-ui';\nimport { Answer, ViewData } from '@vue-skuilder/common';\nimport HorizontalAddition from './horizontal.vue';\nimport VerbalAddition from './verbal.vue';\nimport { SingleDigitAdditionDataShape } from './shapes.js';\n\nconst data = function () {\n const ret: { a: number; b: number }[] = [];\n for (let i = 0; i < 10; i++) {\n for (let j = 0; j < 10; j++) {\n ret.push({\n a: i,\n b: j,\n });\n }\n }\n return ret;\n};\n\nexport class SingleDigitAdditionQuestion extends Question {\n public static dataShapes = [SingleDigitAdditionDataShape];\n\n public static views: ViewComponent[] = [HorizontalAddition, VerbalAddition];\n\n public a: number;\n public b: number;\n\n public static seedData = data();\n public static acceptsUserData = false;\n\n constructor(data: ViewData[]) {\n super(data);\n this.a = data[0].a as number;\n this.b = data[0].b as number;\n }\n\n public isCorrect(answer: Answer) {\n return 1 * this.a + this.b === answer;\n }\n\n public dataShapes() {\n return SingleDigitAdditionQuestion.dataShapes;\n }\n\n public views() {\n return SingleDigitAdditionQuestion.views;\n }\n}\n","<template>\n <div data-viewable=\"DivisionHorizontal\">\n <template v-if=\"question\">\n {{ question.a * question.b }} ÷ {{ question.b }} =\n <UserInputNumber v-model=\"answer\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport { SingleDigitDivisionQuestion } from './index';\nimport { UserInputNumber, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'DivisionHorizontal',\n\n components: {\n UserInputNumber,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'DivisionHorizontal');\n const questionUtils = useQuestionView<SingleDigitDivisionQuestion>(viewableUtils);\n\n const answer = ref('');\n\n // Initialize question immediately\n questionUtils.question.value = new SingleDigitDivisionQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const submit = () => {\n if (question.value) {\n const isCorrect = question.value.isCorrect(parseInt(answer.value, 10));\n alert(isCorrect);\n }\n };\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n submit,\n };\n },\n});\n</script>\n","<template>\n <div data-viewable=\"DivisionHorizontal\">\n <template v-if=\"question\">\n {{ question.a * question.b }} ÷ {{ question.b }} =\n <UserInputNumber v-model=\"answer\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport { SingleDigitDivisionQuestion } from './index';\nimport { UserInputNumber, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'DivisionHorizontal',\n\n components: {\n UserInputNumber,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'DivisionHorizontal');\n const questionUtils = useQuestionView<SingleDigitDivisionQuestion>(viewableUtils);\n\n const answer = ref('');\n\n // Initialize question immediately\n questionUtils.question.value = new SingleDigitDivisionQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const submit = () => {\n if (question.value) {\n const isCorrect = question.value.isCorrect(parseInt(answer.value, 10));\n alert(isCorrect);\n }\n };\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n submit,\n };\n },\n});\n</script>\n","import { Question } from '@vue-skuilder/common-ui';\nimport {\n FieldDefinition,\n Answer,\n ViewData,\n DataShapeName,\n FieldType,\n Status,\n} from '@vue-skuilder/common';\nimport HorizontalDivision from './horizontal.vue';\n\nconst fields: FieldDefinition[] = [\n {\n name: 'a',\n type: FieldType.INT,\n },\n {\n name: 'b',\n type: FieldType.INT,\n validator: {\n instructions: 'An integer between 1 and 10, inclusive.',\n test: (value: string) => {\n const input = parseInt(value, 10);\n if (0 < input && input < 11) {\n return {\n status: Status.ok,\n msg: '',\n };\n } else if (input === 0) {\n return {\n status: Status.error,\n msg: 'Thou shalt not divide by zero.',\n };\n } else {\n return {\n status: Status.error,\n msg: 'Single digit division problem divisors must be between 1 and 10, inclusive.',\n };\n }\n },\n },\n },\n];\n\nexport class SingleDigitDivisionQuestion extends Question {\n public static dataShapes = [\n {\n name: DataShapeName.MATH_SingleDigitDivision,\n fields,\n },\n ];\n\n public static views = [HorizontalDivision];\n\n public a: number;\n public b: number;\n\n /**\n * @param data a and b are seed props that will pop a question of\n * the form [(a*b) / b = ___]. So, b must be non-zero.\n */\n constructor(data: ViewData[]) {\n super(data);\n this.a = data[0].a as number;\n this.b = data[0].b as number;\n }\n\n public isCorrect(answer: Answer) {\n return this.a * this.b === answer;\n }\n\n public dataShapes() {\n return SingleDigitDivisionQuestion.dataShapes;\n }\n\n public views() {\n return SingleDigitDivisionQuestion.views;\n }\n}\n","<template>\n <div data-viewable=\"MultiplicationHorizontal\">\n <template v-if=\"question\">\n {{ question.a }} × {{ question.b }} =\n <UserInputNumber v-model=\"answer\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport { SingleDigitMultiplicationQuestion } from './index';\nimport { UserInputNumber, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'MultiplicationHorizontal',\n\n components: {\n UserInputNumber,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'MultiplicationHorizontal');\n const questionUtils = useQuestionView<SingleDigitMultiplicationQuestion>(viewableUtils);\n\n const answer = ref('');\n\n // Initialize question immediately\n questionUtils.question.value = new SingleDigitMultiplicationQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const submit = () => {\n if (question.value) {\n const isCorrect = question.value.isCorrect(parseInt(answer.value, 10));\n alert(isCorrect);\n }\n };\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n submit,\n };\n },\n});\n</script>\n","<template>\n <div data-viewable=\"MultiplicationHorizontal\">\n <template v-if=\"question\">\n {{ question.a }} × {{ question.b }} =\n <UserInputNumber v-model=\"answer\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport { SingleDigitMultiplicationQuestion } from './index';\nimport { UserInputNumber, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'MultiplicationHorizontal',\n\n components: {\n UserInputNumber,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'MultiplicationHorizontal');\n const questionUtils = useQuestionView<SingleDigitMultiplicationQuestion>(viewableUtils);\n\n const answer = ref('');\n\n // Initialize question immediately\n questionUtils.question.value = new SingleDigitMultiplicationQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const submit = () => {\n if (question.value) {\n const isCorrect = question.value.isCorrect(parseInt(answer.value, 10));\n alert(isCorrect);\n }\n };\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n submit,\n };\n },\n});\n</script>\n","<template>\n <div data-viewable=\"VerbalMultiplication\">\n <template v-if=\"question\">\n {{ question.a }} times {{ question.b }} is\n <UserInputNumber v-model=\"answer\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport { SingleDigitMultiplicationQuestion } from './index';\nimport { UserInputNumber, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'VerbalMultiplication',\n\n components: {\n UserInputNumber,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'VerbalMultiplication');\n const questionUtils = useQuestionView<SingleDigitMultiplicationQuestion>(viewableUtils);\n\n const answer = ref('');\n\n // Initialize question immediately\n questionUtils.question.value = new SingleDigitMultiplicationQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const submit = () => {\n if (question.value) {\n const isCorrect = question.value.isCorrect(parseInt(answer.value, 10));\n alert(isCorrect);\n }\n };\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n submit,\n };\n },\n});\n</script>\n","<template>\n <div data-viewable=\"VerbalMultiplication\">\n <template v-if=\"question\">\n {{ question.a }} times {{ question.b }} is\n <UserInputNumber v-model=\"answer\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport { SingleDigitMultiplicationQuestion } from './index';\nimport { UserInputNumber, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'VerbalMultiplication',\n\n components: {\n UserInputNumber,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'VerbalMultiplication');\n const questionUtils = useQuestionView<SingleDigitMultiplicationQuestion>(viewableUtils);\n\n const answer = ref('');\n\n // Initialize question immediately\n questionUtils.question.value = new SingleDigitMultiplicationQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const submit = () => {\n if (question.value) {\n const isCorrect = question.value.isCorrect(parseInt(answer.value, 10));\n alert(isCorrect);\n }\n };\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n submit,\n };\n },\n});\n</script>\n","import { Question } from '@vue-skuilder/common-ui';\nimport {\n FieldDefinition,\n Answer,\n ViewData,\n DataShapeName,\n FieldType,\n Status,\n} from '@vue-skuilder/common';\nimport MultiplicationHorizontal from './blorizontal.vue';\nimport VerbalMultiplication from './verbal.vue';\n\nconst validator = {\n instructions: 'An integer between 0 and 10, inclusive.',\n test: (value: string) => {\n const input = parseInt(value, 10);\n if (0 <= input && input <= 10) {\n return {\n status: Status.ok,\n msg: '',\n };\n } else {\n return {\n status: Status.error,\n msg: 'Single digit multiplication problem inputs must be between 0 and 10, inclusive.',\n };\n }\n },\n};\n\nconst fields: FieldDefinition[] = [\n {\n name: 'a',\n type: FieldType.INT,\n validator,\n },\n {\n name: 'b',\n type: FieldType.INT,\n validator,\n },\n];\n\nexport class SingleDigitMultiplicationQuestion extends Question {\n public static dataShapes = [\n {\n name: DataShapeName.MATH_SingleDigitMultiplication,\n fields,\n },\n ];\n\n public static views = [VerbalMultiplication, MultiplicationHorizontal];\n\n public a: number;\n public b: number;\n\n constructor(data: ViewData[]) {\n super(data);\n this.a = data[0].a as number;\n this.b = data[0].b as number;\n }\n\n public isCorrect(answer: Answer) {\n return this.a * this.b === answer;\n }\n\n public dataShapes() {\n return SingleDigitMultiplicationQuestion.dataShapes;\n }\n\n public views() {\n return SingleDigitMultiplicationQuestion.views;\n }\n}\n","<template>\n <div data-viewable=\"TrueFalse\">\n {{ question.a }} = {{ question.b }}\n\n <TFSelect :submit=\"submit\" />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, PropType } from 'vue';\nimport { TFSelect, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { EqualityTest } from './index';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'TrueFalse',\n\n components: {\n TFSelect,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'TrueFalse');\n const questionUtils = useQuestionView<EqualityTest>(viewableUtils);\n\n // Initialize question\n questionUtils.question.value = new EqualityTest(props.data);\n\n const question = computed(() => new EqualityTest(props.data));\n\n const submit = (selection: number) => {\n alert(question.value.isCorrect(selection === 0));\n };\n\n return {\n question,\n submit,\n };\n },\n});\n</script>\n","<template>\n <div data-viewable=\"TrueFalse\">\n {{ question.a }} = {{ question.b }}\n\n <TFSelect :submit=\"submit\" />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, PropType } from 'vue';\nimport { TFSelect, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { EqualityTest } from './index';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'TrueFalse',\n\n components: {\n TFSelect,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'TrueFalse');\n const questionUtils = useQuestionView<EqualityTest>(viewableUtils);\n\n // Initialize question\n questionUtils.question.value = new EqualityTest(props.data);\n\n const question = computed(() => new EqualityTest(props.data));\n\n const submit = (selection: number) => {\n alert(question.value.isCorrect(selection === 0));\n };\n\n return {\n question,\n submit,\n };\n },\n});\n</script>\n","import { Question } from '@vue-skuilder/common-ui';\nimport { Answer, ViewData } from '@vue-skuilder/common';\nimport TrueFalse from './trueFalse.vue';\nimport { EqualityTestDataShape } from './shapes.js';\n\nexport class EqualityTest extends Question {\n public static dataShapes = [EqualityTestDataShape];\n\n public static views = [TrueFalse];\n\n public a: string; // vueComponent / \"MathJax expression\" or something\n public b: string;\n\n /**\n * @param data a and b are seed props that will pop a question of\n * the form [(a*b) / b = ___]. So, b must be non-zero.\n */\n constructor(data: ViewData[]) {\n super(data);\n this.a = data[0].a as string;\n this.b = data[0].b as string;\n }\n\n public isCorrect(answer: Answer) {\n return (this.a === this.b) === answer;\n }\n\n public dataShapes() {\n return EqualityTest.dataShapes;\n }\n\n public views() {\n return EqualityTest.views;\n }\n}\n","<template>\n <div data-viewable=\"Solve\">\n <template v-if=\"question\">\n <h4>Solve the Equation</h4>\n <br /><br />\n <div v-if=\"question.operation.valueOf() === 'ADDITION'\">{{ variable }} - {{ question.a }} = {{ question.b }}</div>\n <div v-else-if=\"question.operation.valueOf() === 'SUBTRACTION'\">\n {{ variable }} + {{ question.a }} = {{ question.b }}\n </div>\n <div v-else-if=\"question.operation.valueOf() === 'MULTIPLICATION'\">\n {{ variable }} ÷ {{ question.a }} = {{ question.b }}\n </div>\n <div v-else-if=\"question.operation.valueOf() === 'DIVISION'\">\n {{ variable }} * {{ question.a }} = {{ question.b * question.a }}\n </div>\n <div v-else>No operation!? (This should never show)</div>\n\n <br /><br />\n\n {{ variable }} = <UserInputNumber v-model=\"answer\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport { OneStepEquation } from './index';\nimport { UserInputNumber, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\nimport { randomInt } from '../../utility';\n\nexport default defineComponent({\n name: 'SolveView',\n\n components: {\n UserInputNumber,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'Solve');\n const questionUtils = useQuestionView<OneStepEquation>(viewableUtils);\n\n const answer = ref('');\n const vars = ['a', 'b', 'd', 'A', 'z', 'B', 'd', 'y'];\n const variable = ref(vars[randomInt(0, vars.length)]);\n\n // Initialize question immediately\n questionUtils.question.value = new OneStepEquation(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const submit = () => {\n if (question.value) {\n const isCorrect = question.value.isCorrect(parseInt(answer.value, 10));\n alert(isCorrect);\n }\n };\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n variable,\n submit,\n };\n },\n});\n</script>\n","<template>\n <div data-viewable=\"Solve\">\n <template v-if=\"question\">\n <h4>Solve the Equation</h4>\n <br /><br />\n <div v-if=\"question.operation.valueOf() === 'ADDITION'\">{{ variable }} - {{ question.a }} = {{ question.b }}</div>\n <div v-else-if=\"question.operation.valueOf() === 'SUBTRACTION'\">\n {{ variable }} + {{ question.a }} = {{ question.b }}\n </div>\n <div v-else-if=\"question.operation.valueOf() === 'MULTIPLICATION'\">\n {{ variable }} ÷ {{ question.a }} = {{ question.b }}\n </div>\n <div v-else-if=\"question.operation.valueOf() === 'DIVISION'\">\n {{ variable }} * {{ question.a }} = {{ question.b * question.a }}\n </div>\n <div v-else>No operation!? (This should never show)</div>\n\n <br /><br />\n\n {{ variable }} = <UserInputNumber v-model=\"answer\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport { OneStepEquation } from './index';\nimport { UserInputNumber, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\nimport { randomInt } from '../../utility';\n\nexport default defineComponent({\n name: 'SolveView',\n\n components: {\n UserInputNumber,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'Solve');\n const questionUtils = useQuestionView<OneStepEquation>(viewableUtils);\n\n const answer = ref('');\n const vars = ['a', 'b', 'd', 'A', 'z', 'B', 'd', 'y'];\n const variable = ref(vars[randomInt(0, vars.length)]);\n\n // Initialize question immediately\n questionUtils.question.value = new OneStepEquation(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const submit = () => {\n if (question.value) {\n const isCorrect = question.value.isCorrect(parseInt(answer.value, 10));\n alert(isCorrect);\n }\n };\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n variable,\n submit,\n };\n },\n});\n</script>\n","import { Question } from '@vue-skuilder/common-ui';\nimport {\n ViewData,\n DataShapeName,\n FieldType,\n Status,\n Validator,\n FieldDefinition,\n Answer,\n} from '@vue-skuilder/common';\nimport Solve from './solve.vue';\nimport { log } from '@vue-skuilder/common';\n\nconst validator = {\n instructions: 'An integer between 0 and 10, inclusive.',\n test: (value: string) => {\n const input = parseInt(value, 10);\n if (0 <= input && input <= 100) {\n return {\n status: Status.ok,\n msg: '',\n };\n } else {\n return {\n status: Status.error,\n msg: 'Single-step equation problem inputs must be between 0 and 100, inclusive.',\n };\n }\n },\n};\n\nconst operationValidator: Validator = {\n test: (val: string) => {\n if (\n val === Operation.ADDITION ||\n val === Operation.SUBTRACTION ||\n val === Operation.MULTIPLICATION ||\n val === Operation.DIVISION\n ) {\n return {\n status: Status.ok,\n msg: '',\n };\n } else {\n return {\n status: Status.error,\n msg: `Operation must be ADDITION, SUBTRACTION, MULTIPLICATION, or DIVISION`,\n };\n }\n },\n};\n\nconst fields: FieldDefinition[] = [\n {\n name: 'a',\n type: FieldType.INT,\n validator,\n },\n {\n name: 'b',\n type: FieldType.INT,\n validator,\n },\n {\n name: 'operation',\n type: FieldType.STRING,\n validator: operationValidator,\n },\n];\n\nenum Operation {\n ADDITION = 'ADDITION',\n SUBTRACTION = 'SUBTRACTION',\n MULTIPLICATION = 'MULTIPLICATION',\n DIVISION = 'DIVISION',\n}\n\nexport class OneStepEquation extends Question {\n public static dataShapes = [\n {\n name: DataShapeName.MATH_OneStepEquation,\n fields,\n },\n ];\n\n public static views = [Solve];\n\n public a: number;\n public b: number;\n public operation: Operation;\n\n constructor(data: ViewData[]) {\n super(data);\n this.a = data[0].a as number;\n this.b = data[0].b as number;\n this.operation = data[0].operation as Operation;\n }\n\n public answer(): number {\n let answer: number = 0;\n\n if (this.operation === Operation.ADDITION) {\n // x - a = b\n answer = this.a + this.b;\n } else if (this.operation === Operation.SUBTRACTION) {\n // x + a = b\n answer = this.b - this.a;\n } else if (this.operation === Operation.MULTIPLICATION) {\n // x / a = b\n answer = this.a * this.b;\n } else if (this.operation === Operation.DIVISION) {\n // ax = ab\n answer = this.b;\n }\n\n log(\n `The answer is ${answer}\nThe operation is ${this.operation.valueOf()}\nthis.a = ${this.a}\nthis.b = ${this.b}\n`\n );\n return answer;\n }\n\n public isCorrect(userAnswer: Answer) {\n return userAnswer === this.answer();\n }\n\n public dataShapes() {\n return OneStepEquation.dataShapes;\n }\n\n public views() {\n return OneStepEquation.views;\n }\n}\n","<template>\n <div data-viewable=\"AngleCategorizeV\">\n <template v-if=\"question\">\n <h2>What kind of angle is this?</h2>\n <canvas ref=\"canvasRef\" width=\"300\" height=\"300\"> </canvas>\n\n <radio-multiple-choice :choice-list=\"question.answers\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, onMounted, PropType } from 'vue';\nimport { RadioMultipleChoice, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { AngleCategorize, AngleCategories } from './index';\nimport { ViewData } from '@vue-skuilder/common';\nimport { randomInt } from '../../utility';\n\nexport default defineComponent({\n name: 'AngleCategorizeV',\n\n components: {\n RadioMultipleChoice,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'AngleCategorizeV');\n const questionUtils = useQuestionView<AngleCategorize>(viewableUtils);\n const canvasRef = ref<HTMLCanvasElement | null>(null);\n\n // Initialize question immediately\n questionUtils.question.value = new AngleCategorize(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const angle = computed(() => {\n if (!question.value) return 0;\n\n const category = question.value.angleCategory;\n if (category === AngleCategories.ACUTE) {\n return randomInt(10, 83);\n } else if (category === AngleCategories.RIGHT) {\n return 90;\n } else if (category === AngleCategories.OBTUSE) {\n return randomInt(97, 173);\n } else if (category === AngleCategories.STRAIGHT) {\n return 180;\n } else if (category === AngleCategories.REFLEX) {\n return randomInt(190, 350);\n } else {\n throw new Error('Unknown Angle type on AngleCategorize question');\n }\n });\n\n onMounted(() => {\n if (!canvasRef.value) return;\n\n const width = canvasRef.value.width;\n const height = canvasRef.value.height;\n const ctx = canvasRef.value.getContext('2d');\n if (!ctx) return;\n\n const baseArm = randomInt(0, 360);\n const otherArm = baseArm + angle.value;\n\n ctx.moveTo(width / 2, height / 2);\n const x = width / 2 + width * Math.cos((baseArm / 360) * 2 * Math.PI);\n const y = height / 2 + width * Math.sin((baseArm / 360) * 2 * Math.PI);\n ctx.lineTo(x, y);\n ctx.stroke();\n\n ctx.moveTo(width / 2, height / 2);\n const x2 = width / 2 + width * Math.cos((otherArm / 360) * 2 * Math.PI);\n const y2 = height / 2 + width * Math.sin((otherArm / 360) * 2 * Math.PI);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n ctx.moveTo(width / 2, height / 2);\n ctx.beginPath();\n ctx.arc(width / 2, height / 2, 25, (baseArm / 360) * 2 * Math.PI, (otherArm / 360) * 2 * Math.PI);\n ctx.stroke();\n });\n\n return {\n ...viewableUtils,\n ...questionUtils,\n canvasRef,\n question,\n };\n },\n});\n</script>\n\n<style lang=\"css\" scoped>\n#canvas {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n</style>\n","<template>\n <div data-viewable=\"AngleCategorizeV\">\n <template v-if=\"question\">\n <h2>What kind of angle is this?</h2>\n <canvas ref=\"canvasRef\" width=\"300\" height=\"300\"> </canvas>\n\n <radio-multiple-choice :choice-list=\"question.answers\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, onMounted, PropType } from 'vue';\nimport { RadioMultipleChoice, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { AngleCategorize, AngleCategories } from './index';\nimport { ViewData } from '@vue-skuilder/common';\nimport { randomInt } from '../../utility';\n\nexport default defineComponent({\n name: 'AngleCategorizeV',\n\n components: {\n RadioMultipleChoice,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'AngleCategorizeV');\n const questionUtils = useQuestionView<AngleCategorize>(viewableUtils);\n const canvasRef = ref<HTMLCanvasElement | null>(null);\n\n // Initialize question immediately\n questionUtils.question.value = new AngleCategorize(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const angle = computed(() => {\n if (!question.value) return 0;\n\n const category = question.value.angleCategory;\n if (category === AngleCategories.ACUTE) {\n return randomInt(10, 83);\n } else if (category === AngleCategories.RIGHT) {\n return 90;\n } else if (category === AngleCategories.OBTUSE) {\n return randomInt(97, 173);\n } else if (category === AngleCategories.STRAIGHT) {\n return 180;\n } else if (category === AngleCategories.REFLEX) {\n return randomInt(190, 350);\n } else {\n throw new Error('Unknown Angle type on AngleCategorize question');\n }\n });\n\n onMounted(() => {\n if (!canvasRef.value) return;\n\n const width = canvasRef.value.width;\n const height = canvasRef.value.height;\n const ctx = canvasRef.value.getContext('2d');\n if (!ctx) return;\n\n const baseArm = randomInt(0, 360);\n const otherArm = baseArm + angle.value;\n\n ctx.moveTo(width / 2, height / 2);\n const x = width / 2 + width * Math.cos((baseArm / 360) * 2 * Math.PI);\n const y = height / 2 + width * Math.sin((baseArm / 360) * 2 * Math.PI);\n ctx.lineTo(x, y);\n ctx.stroke();\n\n ctx.moveTo(width / 2, height / 2);\n const x2 = width / 2 + width * Math.cos((otherArm / 360) * 2 * Math.PI);\n const y2 = height / 2 + width * Math.sin((otherArm / 360) * 2 * Math.PI);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n ctx.moveTo(width / 2, height / 2);\n ctx.beginPath();\n ctx.arc(width / 2, height / 2, 25, (baseArm / 360) * 2 * Math.PI, (otherArm / 360) * 2 * Math.PI);\n ctx.stroke();\n });\n\n return {\n ...viewableUtils,\n ...questionUtils,\n canvasRef,\n question,\n };\n },\n});\n</script>\n\n<style lang=\"css\" scoped>\n#canvas {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n</style>\n","import { Question } from '@vue-skuilder/common-ui';\nimport { RadioMultipleChoiceAnswer, FieldDefinition } from '@vue-skuilder/common';\nimport { ViewData, DataShapeName, FieldType, Status } from '@vue-skuilder/common';\nimport { shuffle } from '../../utility';\nimport AngleCategorizeV from './angleCategorize.vue';\n\nconst validator = {\n instructions: 'Must be \"ACUTE\", \"RIGHT\", \"OBTUSE\", \"STRAIGHT\", or \"REFLEX\".',\n test: (value: string) => {\n if (\n value === AngleCategories.ACUTE ||\n value === AngleCategories.OBTUSE ||\n value === AngleCategories.REFLEX ||\n value === AngleCategories.RIGHT ||\n value === AngleCategories.STRAIGHT\n ) {\n return {\n status: Status.ok,\n msg: '',\n };\n } else {\n return {\n status: Status.error,\n msg: 'Must be \"ACUTE\", \"RIGHT\", \"OBTUSE\", \"STRAIGHT\", or \"REFLEX\".',\n };\n }\n },\n};\n\nexport enum AngleCategories {\n ACUTE = 'ACUTE',\n RIGHT = 'RIGHT',\n OBTUSE = 'OBTUSE',\n STRAIGHT = 'STRAIGHT',\n REFLEX = 'REFLEX',\n}\n\nconst fields: FieldDefinition[] = [\n {\n name: 'Category',\n type: FieldType.STRING,\n validator,\n },\n];\n\nexport class AngleCategorize extends Question {\n public static dataShapes = [\n {\n name: DataShapeName.MATH_AngleCategorize,\n fields,\n },\n ];\n\n public static views = [AngleCategorizeV];\n\n public angleCategory: AngleCategories;\n public answers: string[];\n\n constructor(data: ViewData[]) {\n super(data);\n this.angleCategory = data[0].Category as AngleCategories;\n this.answers = shuffle([\n AngleCategories.ACUTE,\n AngleCategories.OBTUSE,\n AngleCategories.REFLEX,\n AngleCategories.RIGHT,\n AngleCategories.STRAIGHT,\n ]);\n }\n\n public isCorrect(answer: RadioMultipleChoiceAnswer) {\n return this.angleCategory.valueOf() === answer.choiceList[answer.selection];\n }\n\n public dataShapes() {\n return AngleCategorize.dataShapes;\n }\n\n public views() {\n return AngleCategorize.views;\n }\n}\n","module.exports = {}","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.acorn = {}));\n})(this, (function (exports) { 'use strict';\n\n // This file was generated. Do not modify manually!\n var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 80, 3, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 343, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 726, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];\n\n // This file was generated. Do not modify manually!\n var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 2, 60, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 42, 9, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 496, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191];\n\n // This file was generated. Do not modify manually!\n var nonASCIIidentifierChars = \"\\u200c\\u200d\\xb7\\u0300-\\u036f\\u0387\\u0483-\\u0487\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u0669\\u0670\\u06d6-\\u06dc\\u06df-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u06f0-\\u06f9\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07c0-\\u07c9\\u07eb-\\u07f3\\u07fd\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0859-\\u085b\\u0897-\\u089f\\u08ca-\\u08e1\\u08e3-\\u0903\\u093a-\\u093c\\u093e-\\u094f\\u0951-\\u0957\\u0962\\u0963\\u0966-\\u096f\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7\\u09c8\\u09cb-\\u09cd\\u09d7\\u09e2\\u09e3\\u09e6-\\u09ef\\u09fe\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a66-\\u0a71\\u0a75\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ae2\\u0ae3\\u0ae6-\\u0aef\\u0afa-\\u0aff\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b55-\\u0b57\\u0b62\\u0b63\\u0b66-\\u0b6f\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0be6-\\u0bef\\u0c00-\\u0c04\\u0c3c\\u0c3e-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0c66-\\u0c6f\\u0c81-\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0ce6-\\u0cef\\u0cf3\\u0d00-\\u0d03\\u0d3b\\u0d3c\\u0d3e-\\u0d44\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0d62\\u0d63\\u0d66-\\u0d6f\\u0d81-\\u0d83\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0de6-\\u0def\\u0df2\\u0df3\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0e50-\\u0e59\\u0eb1\\u0eb4-\\u0ebc\\u0ec8-\\u0ece\\u0ed0-\\u0ed9\\u0f18\\u0f19\\u0f20-\\u0f29\\u0f35\\u0f37\\u0f39\\u0f3e\\u0f3f\\u0f71-\\u0f84\\u0f86\\u0f87\\u0f8d-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102b-\\u103e\\u1040-\\u1049\\u1056-\\u1059\\u105e-\\u1060\\u1062-\\u1064\\u1067-\\u106d\\u1071-\\u1074\\u1082-\\u108d\\u108f-\\u109d\\u135d-\\u135f\\u1369-\\u1371\\u1712-\\u1715\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b4-\\u17d3\\u17dd\\u17e0-\\u17e9\\u180b-\\u180d\\u180f-\\u1819\\u18a9\\u1920-\\u192b\\u1930-\\u193b\\u1946-\\u194f\\u19d0-\\u19da\\u1a17-\\u1a1b\\u1a55-\\u1a5e\\u1a60-\\u1a7c\\u1a7f-\\u1a89\\u1a90-\\u1a99\\u1ab0-\\u1abd\\u1abf-\\u1ace\\u1b00-\\u1b04\\u1b34-\\u1b44\\u1b50-\\u1b59\\u1b6b-\\u1b73\\u1b80-\\u1b82\\u1ba1-\\u1bad\\u1bb0-\\u1bb9\\u1be6-\\u1bf3\\u1c24-\\u1c37\\u1c40-\\u1c49\\u1c50-\\u1c59\\u1cd0-\\u1cd2\\u1cd4-\\u1ce8\\u1ced\\u1cf4\\u1cf7-\\u1cf9\\u1dc0-\\u1dff\\u200c\\u200d\\u203f\\u2040\\u2054\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20f0\\u2cef-\\u2cf1\\u2d7f\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\u30fb\\ua620-\\ua629\\ua66f\\ua674-\\ua67d\\ua69e\\ua69f\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua823-\\ua827\\ua82c\\ua880\\ua881\\ua8b4-\\ua8c5\\ua8d0-\\ua8d9\\ua8e0-\\ua8f1\\ua8ff-\\ua909\\ua926-\\ua92d\\ua947-\\ua953\\ua980-\\ua983\\ua9b3-\\ua9c0\\ua9d0-\\ua9d9\\ua9e5\\ua9f0-\\ua9f9\\uaa29-\\uaa36\\uaa43\\uaa4c\\uaa4d\\uaa50-\\uaa59\\uaa7b-\\uaa7d\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uaaeb-\\uaaef\\uaaf5\\uaaf6\\uabe3-\\uabea\\uabec\\uabed\\uabf0-\\uabf9\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe2f\\ufe33\\ufe34\\ufe4d-\\ufe4f\\uff10-\\uff19\\uff3f\\uff65\";\n\n // This file was generated. Do not modify manually!\n var nonASCIIidentifierStartChars = \"\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0370-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u037f\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u048a-\\u052f\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05d0-\\u05ea\\u05ef-\\u05f2\\u0620-\\u064a\\u066e\\u066f\\u0671-\\u06d3\\u06d5\\u06e5\\u06e6\\u06ee\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\\u0712-\\u072f\\u074d-\\u07a5\\u07b1\\u07ca-\\u07ea\\u07f4\\u07f5\\u07fa\\u0800-\\u0815\\u081a\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086a\\u0870-\\u0887\\u0889-\\u088e\\u08a0-\\u08c9\\u0904-\\u0939\\u093d\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc\\u09dd\\u09df-\\u09e1\\u09f0\\u09f1\\u09fc\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abd\\u0ad0\\u0ae0\\u0ae1\\u0af9\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bd0\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c39\\u0c3d\\u0c58-\\u0c5a\\u0c5d\\u0c60\\u0c61\\u0c80\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cdd\\u0cde\\u0ce0\\u0ce1\\u0cf1\\u0cf2\\u0d04-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d\\u0d4e\\u0d54-\\u0d56\\u0d5f-\\u0d61\\u0d7a-\\u0d7f\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0e01-\\u0e30\\u0e32\\u0e33\\u0e40-\\u0e46\\u0e81\\u0e82\\u0e84\\u0e86-\\u0e8a\\u0e8c-\\u0ea3\\u0ea5\\u0ea7-\\u0eb0\\u0eb2\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0edc-\\u0edf\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6c\\u0f88-\\u0f8c\\u1000-\\u102a\\u103f\\u1050-\\u1055\\u105a-\\u105d\\u1061\\u1065\\u1066\\u106e-\\u1070\\u1075-\\u1081\\u108e\\u10a0-\\u10c5\\u10c7\\u10cd\\u10d0-\\u10fa\\u10fc-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f5\\u13f8-\\u13fd\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16ee-\\u16f8\\u1700-\\u1711\\u171f-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\\u17dc\\u1820-\\u1878\\u1880-\\u18a8\\u18aa\\u18b0-\\u18f5\\u1900-\\u191e\\u1950-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19b0-\\u19c9\\u1a00-\\u1a16\\u1a20-\\u1a54\\u1aa7\\u1b05-\\u1b33\\u1b45-\\u1b4c\\u1b83-\\u1ba0\\u1bae\\u1baf\\u1bba-\\u1be5\\u1c00-\\u1c23\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1c80-\\u1c8a\\u1c90-\\u1cba\\u1cbd-\\u1cbf\\u1ce9-\\u1cec\\u1cee-\\u1cf3\\u1cf5\\u1cf6\\u1cfa\\u1d00-\\u1dbf\\u1e00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u209c\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2118-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2160-\\u2188\\u2c00-\\u2ce4\\u2ceb-\\u2cee\\u2cf2\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d80-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303c\\u3041-\\u3096\\u309b-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312f\\u3131-\\u318e\\u31a0-\\u31bf\\u31f0-\\u31ff\\u3400-\\u4dbf\\u4e00-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua66e\\ua67f-\\ua69d\\ua6a0-\\ua6ef\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua7cd\\ua7d0\\ua7d1\\ua7d3\\ua7d5-\\ua7dc\\ua7f2-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\\ua80c-\\ua822\\ua840-\\ua873\\ua882-\\ua8b3\\ua8f2-\\ua8f7\\ua8fb\\ua8fd\\ua8fe\\ua90a-\\ua925\\ua930-\\ua946\\ua960-\\ua97c\\ua984-\\ua9b2\\ua9cf\\ua9e0-\\ua9e4\\ua9e6-\\ua9ef\\ua9fa-\\ua9fe\\uaa00-\\uaa28\\uaa40-\\uaa42\\uaa44-\\uaa4b\\uaa60-\\uaa76\\uaa7a\\uaa7e-\\uaaaf\\uaab1\\uaab5\\uaab6\\uaab9-\\uaabd\\uaac0\\uaac2\\uaadb-\\uaadd\\uaae0-\\uaaea\\uaaf2-\\uaaf4\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uab30-\\uab5a\\uab5c-\\uab69\\uab70-\\uabe2\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc\";\n\n // These are a run-length and offset encoded representation of the\n // >0xffff code points that are a valid part of identifiers. The\n // offset starts at 0x10000, and each pair of numbers represents an\n // offset to the next range, and then a size of the range.\n\n // Reserved word lists for various dialects of the language\n\n var reservedWords = {\n 3: \"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile\",\n 5: \"class enum extends super const export import\",\n 6: \"enum\",\n strict: \"implements interface let package private protected public static yield\",\n strictBind: \"eval arguments\"\n };\n\n // And the keywords\n\n var ecma5AndLessKeywords = \"break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this\";\n\n var keywords$1 = {\n 5: ecma5AndLessKeywords,\n \"5module\": ecma5AndLessKeywords + \" export import\",\n 6: ecma5AndLessKeywords + \" const class extends export import super\"\n };\n\n var keywordRelationalOperator = /^in(stanceof)?$/;\n\n // ## Character categories\n\n var nonASCIIidentifierStart = new RegExp(\"[\" + nonASCIIidentifierStartChars + \"]\");\n var nonASCIIidentifier = new RegExp(\"[\" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"]\");\n\n // This has a complexity linear to the value of the code. The\n // assumption is that looking up astral identifier characters is\n // rare.\n function isInAstralSet(code, set) {\n var pos = 0x10000;\n for (var i = 0; i < set.length; i += 2) {\n pos += set[i];\n if (pos > code) { return false }\n pos += set[i + 1];\n if (pos >= code) { return true }\n }\n return false\n }\n\n // Test whether a given character code starts an identifier.\n\n function isIdentifierStart(code, astral) {\n if (code < 65) { return code === 36 }\n if (code < 91) { return true }\n if (code < 97) { return code === 95 }\n if (code < 123) { return true }\n if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)) }\n if (astral === false) { return false }\n return isInAstralSet(code, astralIdentifierStartCodes)\n }\n\n // Test whether a given character is part of an identifier.\n\n function isIdentifierChar(code, astral) {\n if (code < 48) { return code === 36 }\n if (code < 58) { return true }\n if (code < 65) { return false }\n if (code < 91) { return true }\n if (code < 97) { return code === 95 }\n if (code < 123) { return true }\n if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)) }\n if (astral === false) { return false }\n return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes)\n }\n\n // ## Token types\n\n // The assignment of fine-grained, information-carrying type objects\n // allows the tokenizer to store the information it has about a\n // token in a way that is very cheap for the parser to look up.\n\n // All token type variables start with an underscore, to make them\n // easy to recognize.\n\n // The `beforeExpr` property is used to disambiguate between regular\n // expressions and divisions. It is set on all token types that can\n // be followed by an expression (thus, a slash after them would be a\n // regular expression).\n //\n // The `startsExpr` property is used to check if the token ends a\n // `yield` expression. It is set on all token types that either can\n // directly start an expression (like a quotation mark) or can\n // continue an expression (like the body of a string).\n //\n // `isLoop` marks a keyword as starting a loop, which is important\n // to know when parsing a label, in order to allow or disallow\n // continue jumps to that label.\n\n var TokenType = function TokenType(label, conf) {\n if ( conf === void 0 ) conf = {};\n\n this.label = label;\n this.keyword = conf.keyword;\n this.beforeExpr = !!conf.beforeExpr;\n this.startsExpr = !!conf.startsExpr;\n this.isLoop = !!conf.isLoop;\n this.isAssign = !!conf.isAssign;\n this.prefix = !!conf.prefix;\n this.postfix = !!conf.postfix;\n this.binop = conf.binop || null;\n this.updateContext = null;\n };\n\n function binop(name, prec) {\n return new TokenType(name, {beforeExpr: true, binop: prec})\n }\n var beforeExpr = {beforeExpr: true}, startsExpr = {startsExpr: true};\n\n // Map keyword names to token types.\n\n var keywords = {};\n\n // Succinct definitions of keyword token types\n function kw(name, options) {\n if ( options === void 0 ) options = {};\n\n options.keyword = name;\n return keywords[name] = new TokenType(name, options)\n }\n\n var types$1 = {\n num: new TokenType(\"num\", startsExpr),\n regexp: new TokenType(\"regexp\", startsExpr),\n string: new TokenType(\"string\", startsExpr),\n name: new TokenType(\"name\", startsExpr),\n privateId: new TokenType(\"privateId\", startsExpr),\n eof: new TokenType(\"eof\"),\n\n // Punctuation token types.\n bracketL: new TokenType(\"[\", {beforeExpr: true, startsExpr: true}),\n bracketR: new TokenType(\"]\"),\n braceL: new TokenType(\"{\", {beforeExpr: true, startsExpr: true}),\n braceR: new TokenType(\"}\"),\n parenL: new TokenType(\"(\", {beforeExpr: true, startsExpr: true}),\n parenR: new TokenType(\")\"),\n comma: new TokenType(\",\", beforeExpr),\n semi: new TokenType(\";\", beforeExpr),\n colon: new TokenType(\":\", beforeExpr),\n dot: new TokenType(\".\"),\n question: new TokenType(\"?\", beforeExpr),\n questionDot: new TokenType(\"?.\"),\n arrow: new TokenType(\"=>\", beforeExpr),\n template: new TokenType(\"template\"),\n invalidTemplate: new TokenType(\"invalidTemplate\"),\n ellipsis: new TokenType(\"...\", beforeExpr),\n backQuote: new TokenType(\"`\", startsExpr),\n dollarBraceL: new TokenType(\"${\", {beforeExpr: true, startsExpr: true}),\n\n // Operators. These carry several kinds of properties to help the\n // parser use them properly (the presence of these properties is\n // what categorizes them as operators).\n //\n // `binop`, when present, specifies that this operator is a binary\n // operator, and will refer to its precedence.\n //\n // `prefix` and `postfix` mark the operator as a prefix or postfix\n // unary operator.\n //\n // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as\n // binary operators with a very low precedence, that should result\n // in AssignmentExpression nodes.\n\n eq: new TokenType(\"=\", {beforeExpr: true, isAssign: true}),\n assign: new TokenType(\"_=\", {beforeExpr: true, isAssign: true}),\n incDec: new TokenType(\"++/--\", {prefix: true, postfix: true, startsExpr: true}),\n prefix: new TokenType(\"!/~\", {beforeExpr: true, prefix: true, startsExpr: true}),\n logicalOR: binop(\"||\", 1),\n logicalAND: binop(\"&&\", 2),\n bitwiseOR: binop(\"|\", 3),\n bitwiseXOR: binop(\"^\", 4),\n bitwiseAND: binop(\"&\", 5),\n equality: binop(\"==/!=/===/!==\", 6),\n relational: binop(\"</>/<=/>=\", 7),\n bitShift: binop(\"<</>>/>>>\", 8),\n plusMin: new TokenType(\"+/-\", {beforeExpr: true, binop: 9, prefix: true, startsExpr: true}),\n modulo: binop(\"%\", 10),\n star: binop(\"*\", 10),\n slash: binop(\"/\", 10),\n starstar: new TokenType(\"**\", {beforeExpr: true}),\n coalesce: binop(\"??\", 1),\n\n // Keyword token types.\n _break: kw(\"break\"),\n _case: kw(\"case\", beforeExpr),\n _catch: kw(\"catch\"),\n _continue: kw(\"continue\"),\n _debugger: kw(\"debugger\"),\n _default: kw(\"default\", beforeExpr),\n _do: kw(\"do\", {isLoop: true, beforeExpr: true}),\n _else: kw(\"else\", beforeExpr),\n _finally: kw(\"finally\"),\n _for: kw(\"for\", {isLoop: true}),\n _function: kw(\"function\", startsExpr),\n _if: kw(\"if\"),\n _return: kw(\"return\", beforeExpr),\n _switch: kw(\"switch\"),\n _throw: kw(\"throw\", beforeExpr),\n _try: kw(\"try\"),\n _var: kw(\"var\"),\n _const: kw(\"const\"),\n _while: kw(\"while\", {isLoop: true}),\n _with: kw(\"with\"),\n _new: kw(\"new\", {beforeExpr: true, startsExpr: true}),\n _this: kw(\"this\", startsExpr),\n _super: kw(\"super\", startsExpr),\n _class: kw(\"class\", startsExpr),\n _extends: kw(\"extends\", beforeExpr),\n _export: kw(\"export\"),\n _import: kw(\"import\", startsExpr),\n _null: kw(\"null\", startsExpr),\n _true: kw(\"true\", startsExpr),\n _false: kw(\"false\", startsExpr),\n _in: kw(\"in\", {beforeExpr: true, binop: 7}),\n _instanceof: kw(\"instanceof\", {beforeExpr: true, binop: 7}),\n _typeof: kw(\"typeof\", {beforeExpr: true, prefix: true, startsExpr: true}),\n _void: kw(\"void\", {beforeExpr: true, prefix: true, startsExpr: true}),\n _delete: kw(\"delete\", {beforeExpr: true, prefix: true, startsExpr: true})\n };\n\n // Matches a whole line break (where CRLF is considered a single\n // line break). Used to count lines.\n\n var lineBreak = /\\r\\n?|\\n|\\u2028|\\u2029/;\n var lineBreakG = new RegExp(lineBreak.source, \"g\");\n\n function isNewLine(code) {\n return code === 10 || code === 13 || code === 0x2028 || code === 0x2029\n }\n\n function nextLineBreak(code, from, end) {\n if ( end === void 0 ) end = code.length;\n\n for (var i = from; i < end; i++) {\n var next = code.charCodeAt(i);\n if (isNewLine(next))\n { return i < end - 1 && next === 13 && code.charCodeAt(i + 1) === 10 ? i + 2 : i + 1 }\n }\n return -1\n }\n\n var nonASCIIwhitespace = /[\\u1680\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff]/;\n\n var skipWhiteSpace = /(?:\\s|\\/\\/.*|\\/\\*[^]*?\\*\\/)*/g;\n\n var ref = Object.prototype;\n var hasOwnProperty = ref.hasOwnProperty;\n var toString = ref.toString;\n\n var hasOwn = Object.hasOwn || (function (obj, propName) { return (\n hasOwnProperty.call(obj, propName)\n ); });\n\n var isArray = Array.isArray || (function (obj) { return (\n toString.call(obj) === \"[object Array]\"\n ); });\n\n var regexpCache = Object.create(null);\n\n function wordsRegexp(words) {\n return regexpCache[words] || (regexpCache[words] = new RegExp(\"^(?:\" + words.replace(/ /g, \"|\") + \")$\"))\n }\n\n function codePointToString(code) {\n // UTF-16 Decoding\n if (code <= 0xFFFF) { return String.fromCharCode(code) }\n code -= 0x10000;\n return String.fromCharCode((code >> 10) + 0xD800, (code & 1023) + 0xDC00)\n }\n\n var loneSurrogate = /(?:[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])/;\n\n // These are used when `options.locations` is on, for the\n // `startLoc` and `endLoc` properties.\n\n var Position = function Position(line, col) {\n this.line = line;\n this.column = col;\n };\n\n Position.prototype.offset = function offset (n) {\n return new Position(this.line, this.column + n)\n };\n\n var SourceLocation = function SourceLocation(p, start, end) {\n this.start = start;\n this.end = end;\n if (p.sourceFile !== null) { this.source = p.sourceFile; }\n };\n\n // The `getLineInfo` function is mostly useful when the\n // `locations` option is off (for performance reasons) and you\n // want to find the line/column position for a given character\n // offset. `input` should be the code string that the offset refers\n // into.\n\n function getLineInfo(input, offset) {\n for (var line = 1, cur = 0;;) {\n var nextBreak = nextLineBreak(input, cur, offset);\n if (nextBreak < 0) { return new Position(line, offset - cur) }\n ++line;\n cur = nextBreak;\n }\n }\n\n // A second argument must be given to configure the parser process.\n // These options are recognized (only `ecmaVersion` is required):\n\n var defaultOptions = {\n // `ecmaVersion` indicates the ECMAScript version to parse. Must be\n // either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10\n // (2019), 11 (2020), 12 (2021), 13 (2022), 14 (2023), or `\"latest\"`\n // (the latest version the library supports). This influences\n // support for strict mode, the set of reserved words, and support\n // for new syntax features.\n ecmaVersion: null,\n // `sourceType` indicates the mode the code should be parsed in.\n // Can be either `\"script\"` or `\"module\"`. This influences global\n // strict mode and parsing of `import` and `export` declarations.\n sourceType: \"script\",\n // `onInsertedSemicolon` can be a callback that will be called when\n // a semicolon is automatically inserted. It will be passed the\n // position of the inserted semicolon as an offset, and if\n // `locations` is enabled, it is given the location as a `{line,\n // column}` object as second argument.\n onInsertedSemicolon: null,\n // `onTrailingComma` is similar to `onInsertedSemicolon`, but for\n // trailing commas.\n onTrailingComma: null,\n // By default, reserved words are only enforced if ecmaVersion >= 5.\n // Set `allowReserved` to a boolean value to explicitly turn this on\n // an off. When this option has the value \"never\", reserved words\n // and keywords can also not be used as property names.\n allowReserved: null,\n // When enabled, a return at the top level is not considered an\n // error.\n allowReturnOutsideFunction: false,\n // When enabled, import/export statements are not constrained to\n // appearing at the top of the program, and an import.meta expression\n // in a script isn't considered an error.\n allowImportExportEverywhere: false,\n // By default, await identifiers are allowed to appear at the top-level scope only if ecmaVersion >= 2022.\n // When enabled, await identifiers are allowed to appear at the top-level scope,\n // but they are still not allowed in non-async functions.\n allowAwaitOutsideFunction: null,\n // When enabled, super identifiers are not constrained to\n // appearing in methods and do not raise an error when they appear elsewhere.\n allowSuperOutsideMethod: null,\n // When enabled, hashbang directive in the beginning of file is\n // allowed and treated as a line comment. Enabled by default when\n // `ecmaVersion` >= 2023.\n allowHashBang: false,\n // By default, the parser will verify that private properties are\n // only used in places where they are valid and have been declared.\n // Set this to false to turn such checks off.\n checkPrivateFields: true,\n // When `locations` is on, `loc` properties holding objects with\n // `start` and `end` properties in `{line, column}` form (with\n // line being 1-based and column 0-based) will be attached to the\n // nodes.\n locations: false,\n // A function can be passed as `onToken` option, which will\n // cause Acorn to call that function with object in the same\n // format as tokens returned from `tokenizer().getToken()`. Note\n // that you are not allowed to call the parser from the\n // callback—that will corrupt its internal state.\n onToken: null,\n // A function can be passed as `onComment` option, which will\n // cause Acorn to call that function with `(block, text, start,\n // end)` parameters whenever a comment is skipped. `block` is a\n // boolean indicating whether this is a block (`/* */`) comment,\n // `text` is the content of the comment, and `start` and `end` are\n // character offsets that denote the start and end of the comment.\n // When the `locations` option is on, two more parameters are\n // passed, the full `{line, column}` locations of the start and\n // end of the comments. Note that you are not allowed to call the\n // parser from the callback—that will corrupt its internal state.\n // When this option has an array as value, objects representing the\n // comments are pushed to it.\n onComment: null,\n // Nodes have their start and end characters offsets recorded in\n // `start` and `end` properties (directly on the node, rather than\n // the `loc` object, which holds line/column data. To also add a\n // [semi-standardized][range] `range` property holding a `[start,\n // end]` array with the same numbers, set the `ranges` option to\n // `true`.\n //\n // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678\n ranges: false,\n // It is possible to parse multiple files into a single AST by\n // passing the tree produced by parsing the first file as\n // `program` option in subsequent parses. This will add the\n // toplevel forms of the parsed file to the `Program` (top) node\n // of an existing parse tree.\n program: null,\n // When `locations` is on, you can pass this to record the source\n // file in every node's `loc` object.\n sourceFile: null,\n // This value, if given, is stored in every node, whether\n // `locations` is on or off.\n directSourceFile: null,\n // When enabled, parenthesized expressions are represented by\n // (non-standard) ParenthesizedExpression nodes\n preserveParens: false\n };\n\n // Interpret and default an options object\n\n var warnedAboutEcmaVersion = false;\n\n function getOptions(opts) {\n var options = {};\n\n for (var opt in defaultOptions)\n { options[opt] = opts && hasOwn(opts, opt) ? opts[opt] : defaultOptions[opt]; }\n\n if (options.ecmaVersion === \"latest\") {\n options.ecmaVersion = 1e8;\n } else if (options.ecmaVersion == null) {\n if (!warnedAboutEcmaVersion && typeof console === \"object\" && console.warn) {\n warnedAboutEcmaVersion = true;\n console.warn(\"Since Acorn 8.0.0, options.ecmaVersion is required.\\nDefaulting to 2020, but this will stop working in the future.\");\n }\n options.ecmaVersion = 11;\n } else if (options.ecmaVersion >= 2015) {\n options.ecmaVersion -= 2009;\n }\n\n if (options.allowReserved == null)\n { options.allowReserved = options.ecmaVersion < 5; }\n\n if (!opts || opts.allowHashBang == null)\n { options.allowHashBang = options.ecmaVersion >= 14; }\n\n if (isArray(options.onToken)) {\n var tokens = options.onToken;\n options.onToken = function (token) { return tokens.push(token); };\n }\n if (isArray(options.onComment))\n { options.onComment = pushComment(options, options.onComment); }\n\n return options\n }\n\n function pushComment(options, array) {\n return function(block, text, start, end, startLoc, endLoc) {\n var comment = {\n type: block ? \"Block\" : \"Line\",\n value: text,\n start: start,\n end: end\n };\n if (options.locations)\n { comment.loc = new SourceLocation(this, startLoc, endLoc); }\n if (options.ranges)\n { comment.range = [start, end]; }\n array.push(comment);\n }\n }\n\n // Each scope gets a bitset that may contain these flags\n var\n SCOPE_TOP = 1,\n SCOPE_FUNCTION = 2,\n SCOPE_ASYNC = 4,\n SCOPE_GENERATOR = 8,\n SCOPE_ARROW = 16,\n SCOPE_SIMPLE_CATCH = 32,\n SCOPE_SUPER = 64,\n SCOPE_DIRECT_SUPER = 128,\n SCOPE_CLASS_STATIC_BLOCK = 256,\n SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK;\n\n function functionFlags(async, generator) {\n return SCOPE_FUNCTION | (async ? SCOPE_ASYNC : 0) | (generator ? SCOPE_GENERATOR : 0)\n }\n\n // Used in checkLVal* and declareName to determine the type of a binding\n var\n BIND_NONE = 0, // Not a binding\n BIND_VAR = 1, // Var-style binding\n BIND_LEXICAL = 2, // Let- or const-style binding\n BIND_FUNCTION = 3, // Function declaration\n BIND_SIMPLE_CATCH = 4, // Simple (identifier pattern) catch binding\n BIND_OUTSIDE = 5; // Special case for function names as bound inside the function\n\n var Parser = function Parser(options, input, startPos) {\n this.options = options = getOptions(options);\n this.sourceFile = options.sourceFile;\n this.keywords = wordsRegexp(keywords$1[options.ecmaVersion >= 6 ? 6 : options.sourceType === \"module\" ? \"5module\" : 5]);\n var reserved = \"\";\n if (options.allowReserved !== true) {\n reserved = reservedWords[options.ecmaVersion >= 6 ? 6 : options.ecmaVersion === 5 ? 5 : 3];\n if (options.sourceType === \"module\") { reserved += \" await\"; }\n }\n this.reservedWords = wordsRegexp(reserved);\n var reservedStrict = (reserved ? reserved + \" \" : \"\") + reservedWords.strict;\n this.reservedWordsStrict = wordsRegexp(reservedStrict);\n this.reservedWordsStrictBind = wordsRegexp(reservedStrict + \" \" + reservedWords.strictBind);\n this.input = String(input);\n\n // Used to signal to callers of `readWord1` whether the word\n // contained any escape sequences. This is needed because words with\n // escape sequences must not be interpreted as keywords.\n this.containsEsc = false;\n\n // Set up token state\n\n // The current position of the tokenizer in the input.\n if (startPos) {\n this.pos = startPos;\n this.lineStart = this.input.lastIndexOf(\"\\n\", startPos - 1) + 1;\n this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length;\n } else {\n this.pos = this.lineStart = 0;\n this.curLine = 1;\n }\n\n // Properties of the current token:\n // Its type\n this.type = types$1.eof;\n // For tokens that include more information than their type, the value\n this.value = null;\n // Its start and end offset\n this.start = this.end = this.pos;\n // And, if locations are used, the {line, column} object\n // corresponding to those offsets\n this.startLoc = this.endLoc = this.curPosition();\n\n // Position information for the previous token\n this.lastTokEndLoc = this.lastTokStartLoc = null;\n this.lastTokStart = this.lastTokEnd = this.pos;\n\n // The context stack is used to superficially track syntactic\n // context to predict whether a regular expression is allowed in a\n // given position.\n this.context = this.initialContext();\n this.exprAllowed = true;\n\n // Figure out if it's a module code.\n this.inModule = options.sourceType === \"module\";\n this.strict = this.inModule || this.strictDirective(this.pos);\n\n // Used to signify the start of a potential arrow function\n this.potentialArrowAt = -1;\n this.potentialArrowInForAwait = false;\n\n // Positions to delayed-check that yield/await does not exist in default parameters.\n this.yieldPos = this.awaitPos = this.awaitIdentPos = 0;\n // Labels in scope.\n this.labels = [];\n // Thus-far undefined exports.\n this.undefinedExports = Object.create(null);\n\n // If enabled, skip leading hashbang line.\n if (this.pos === 0 && options.allowHashBang && this.input.slice(0, 2) === \"#!\")\n { this.skipLineComment(2); }\n\n // Scope tracking for duplicate variable names (see scope.js)\n this.scopeStack = [];\n this.enterScope(SCOPE_TOP);\n\n // For RegExp validation\n this.regexpState = null;\n\n // The stack of private names.\n // Each element has two properties: 'declared' and 'used'.\n // When it exited from the outermost class definition, all used private names must be declared.\n this.privateNameStack = [];\n };\n\n var prototypeAccessors = { inFunction: { configurable: true },inGenerator: { configurable: true },inAsync: { configurable: true },canAwait: { configurable: true },allowSuper: { configurable: true },allowDirectSuper: { configurable: true },treatFunctionsAsVar: { configurable: true },allowNewDotTarget: { configurable: true },inClassStaticBlock: { configurable: true } };\n\n Parser.prototype.parse = function parse () {\n var node = this.options.program || this.startNode();\n this.nextToken();\n return this.parseTopLevel(node)\n };\n\n prototypeAccessors.inFunction.get = function () { return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0 };\n\n prototypeAccessors.inGenerator.get = function () { return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 && !this.currentVarScope().inClassFieldInit };\n\n prototypeAccessors.inAsync.get = function () { return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 && !this.currentVarScope().inClassFieldInit };\n\n prototypeAccessors.canAwait.get = function () {\n for (var i = this.scopeStack.length - 1; i >= 0; i--) {\n var scope = this.scopeStack[i];\n if (scope.inClassFieldInit || scope.flags & SCOPE_CLASS_STATIC_BLOCK) { return false }\n if (scope.flags & SCOPE_FUNCTION) { return (scope.flags & SCOPE_ASYNC) > 0 }\n }\n return (this.inModule && this.options.ecmaVersion >= 13) || this.options.allowAwaitOutsideFunction\n };\n\n prototypeAccessors.allowSuper.get = function () {\n var ref = this.currentThisScope();\n var flags = ref.flags;\n var inClassFieldInit = ref.inClassFieldInit;\n return (flags & SCOPE_SUPER) > 0 || inClassFieldInit || this.options.allowSuperOutsideMethod\n };\n\n prototypeAccessors.allowDirectSuper.get = function () { return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0 };\n\n prototypeAccessors.treatFunctionsAsVar.get = function () { return this.treatFunctionsAsVarInScope(this.currentScope()) };\n\n prototypeAccessors.allowNewDotTarget.get = function () {\n var ref = this.currentThisScope();\n var flags = ref.flags;\n var inClassFieldInit = ref.inClassFieldInit;\n return (flags & (SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK)) > 0 || inClassFieldInit\n };\n\n prototypeAccessors.inClassStaticBlock.get = function () {\n return (this.currentVarScope().flags & SCOPE_CLASS_STATIC_BLOCK) > 0\n };\n\n Parser.extend = function extend () {\n var plugins = [], len = arguments.length;\n while ( len-- ) plugins[ len ] = arguments[ len ];\n\n var cls = this;\n for (var i = 0; i < plugins.length; i++) { cls = plugins[i](cls); }\n return cls\n };\n\n Parser.parse = function parse (input, options) {\n return new this(options, input).parse()\n };\n\n Parser.parseExpressionAt = function parseExpressionAt (input, pos, options) {\n var parser = new this(options, input, pos);\n parser.nextToken();\n return parser.parseExpression()\n };\n\n Parser.tokenizer = function tokenizer (input, options) {\n return new this(options, input)\n };\n\n Object.defineProperties( Parser.prototype, prototypeAccessors );\n\n var pp$9 = Parser.prototype;\n\n // ## Parser utilities\n\n var literal = /^(?:'((?:\\\\[^]|[^'\\\\])*?)'|\"((?:\\\\[^]|[^\"\\\\])*?)\")/;\n pp$9.strictDirective = function(start) {\n if (this.options.ecmaVersion < 5) { return false }\n for (;;) {\n // Try to find string literal.\n skipWhiteSpace.lastIndex = start;\n start += skipWhiteSpace.exec(this.input)[0].length;\n var match = literal.exec(this.input.slice(start));\n if (!match) { return false }\n if ((match[1] || match[2]) === \"use strict\") {\n skipWhiteSpace.lastIndex = start + match[0].length;\n var spaceAfter = skipWhiteSpace.exec(this.input), end = spaceAfter.index + spaceAfter[0].length;\n var next = this.input.charAt(end);\n return next === \";\" || next === \"}\" ||\n (lineBreak.test(spaceAfter[0]) &&\n !(/[(`.[+\\-/*%<>=,?^&]/.test(next) || next === \"!\" && this.input.charAt(end + 1) === \"=\"))\n }\n start += match[0].length;\n\n // Skip semicolon, if any.\n skipWhiteSpace.lastIndex = start;\n start += skipWhiteSpace.exec(this.input)[0].length;\n if (this.input[start] === \";\")\n { start++; }\n }\n };\n\n // Predicate that tests whether the next token is of the given\n // type, and if yes, consumes it as a side effect.\n\n pp$9.eat = function(type) {\n if (this.type === type) {\n this.next();\n return true\n } else {\n return false\n }\n };\n\n // Tests whether parsed token is a contextual keyword.\n\n pp$9.isContextual = function(name) {\n return this.type === types$1.name && this.value === name && !this.containsEsc\n };\n\n // Consumes contextual keyword if possible.\n\n pp$9.eatContextual = function(name) {\n if (!this.isContextual(name)) { return false }\n this.next();\n return true\n };\n\n // Asserts that following token is given contextual keyword.\n\n pp$9.expectContextual = function(name) {\n if (!this.eatContextual(name)) { this.unexpected(); }\n };\n\n // Test whether a semicolon can be inserted at the current position.\n\n pp$9.canInsertSemicolon = function() {\n return this.type === types$1.eof ||\n this.type === types$1.braceR ||\n lineBreak.test(this.input.slice(this.lastTokEnd, this.start))\n };\n\n pp$9.insertSemicolon = function() {\n if (this.canInsertSemicolon()) {\n if (this.options.onInsertedSemicolon)\n { this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc); }\n return true\n }\n };\n\n // Consume a semicolon, or, failing that, see if we are allowed to\n // pretend that there is a semicolon at this position.\n\n pp$9.semicolon = function() {\n if (!this.eat(types$1.semi) && !this.insertSemicolon()) { this.unexpected(); }\n };\n\n pp$9.afterTrailingComma = function(tokType, notNext) {\n if (this.type === tokType) {\n if (this.options.onTrailingComma)\n { this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc); }\n if (!notNext)\n { this.next(); }\n return true\n }\n };\n\n // Expect a token of a given type. If found, consume it, otherwise,\n // raise an unexpected token error.\n\n pp$9.expect = function(type) {\n this.eat(type) || this.unexpected();\n };\n\n // Raise an unexpected token error.\n\n pp$9.unexpected = function(pos) {\n this.raise(pos != null ? pos : this.start, \"Unexpected token\");\n };\n\n var DestructuringErrors = function DestructuringErrors() {\n this.shorthandAssign =\n this.trailingComma =\n this.parenthesizedAssign =\n this.parenthesizedBind =\n this.doubleProto =\n -1;\n };\n\n pp$9.checkPatternErrors = function(refDestructuringErrors, isAssign) {\n if (!refDestructuringErrors) { return }\n if (refDestructuringErrors.trailingComma > -1)\n { this.raiseRecoverable(refDestructuringErrors.trailingComma, \"Comma is not permitted after the rest element\"); }\n var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind;\n if (parens > -1) { this.raiseRecoverable(parens, isAssign ? \"Assigning to rvalue\" : \"Parenthesized pattern\"); }\n };\n\n pp$9.checkExpressionErrors = function(refDestructuringErrors, andThrow) {\n if (!refDestructuringErrors) { return false }\n var shorthandAssign = refDestructuringErrors.shorthandAssign;\n var doubleProto = refDestructuringErrors.doubleProto;\n if (!andThrow) { return shorthandAssign >= 0 || doubleProto >= 0 }\n if (shorthandAssign >= 0)\n { this.raise(shorthandAssign, \"Shorthand property assignments are valid only in destructuring patterns\"); }\n if (doubleProto >= 0)\n { this.raiseRecoverable(doubleProto, \"Redefinition of __proto__ property\"); }\n };\n\n pp$9.checkYieldAwaitInDefaultParams = function() {\n if (this.yieldPos && (!this.awaitPos || this.yieldPos < this.awaitPos))\n { this.raise(this.yieldPos, \"Yield expression cannot be a default value\"); }\n if (this.awaitPos)\n { this.raise(this.awaitPos, \"Await expression cannot be a default value\"); }\n };\n\n pp$9.isSimpleAssignTarget = function(expr) {\n if (expr.type === \"ParenthesizedExpression\")\n { return this.isSimpleAssignTarget(expr.expression) }\n return expr.type === \"Identifier\" || expr.type === \"MemberExpression\"\n };\n\n var pp$8 = Parser.prototype;\n\n // ### Statement parsing\n\n // Parse a program. Initializes the parser, reads any number of\n // statements, and wraps them in a Program node. Optionally takes a\n // `program` argument. If present, the statements will be appended\n // to its body instead of creating a new node.\n\n pp$8.parseTopLevel = function(node) {\n var exports = Object.create(null);\n if (!node.body) { node.body = []; }\n while (this.type !== types$1.eof) {\n var stmt = this.parseStatement(null, true, exports);\n node.body.push(stmt);\n }\n if (this.inModule)\n { for (var i = 0, list = Object.keys(this.undefinedExports); i < list.length; i += 1)\n {\n var name = list[i];\n\n this.raiseRecoverable(this.undefinedExports[name].start, (\"Export '\" + name + \"' is not defined\"));\n } }\n this.adaptDirectivePrologue(node.body);\n this.next();\n node.sourceType = this.options.sourceType;\n return this.finishNode(node, \"Program\")\n };\n\n var loopLabel = {kind: \"loop\"}, switchLabel = {kind: \"switch\"};\n\n pp$8.isLet = function(context) {\n if (this.options.ecmaVersion < 6 || !this.isContextual(\"let\")) { return false }\n skipWhiteSpace.lastIndex = this.pos;\n var skip = skipWhiteSpace.exec(this.input);\n var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next);\n // For ambiguous cases, determine if a LexicalDeclaration (or only a\n // Statement) is allowed here. If context is not empty then only a Statement\n // is allowed. However, `let [` is an explicit negative lookahead for\n // ExpressionStatement, so special-case it first.\n if (nextCh === 91 || nextCh === 92) { return true } // '[', '\\'\n if (context) { return false }\n\n if (nextCh === 123 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true } // '{', astral\n if (isIdentifierStart(nextCh, true)) {\n var pos = next + 1;\n while (isIdentifierChar(nextCh = this.input.charCodeAt(pos), true)) { ++pos; }\n if (nextCh === 92 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true }\n var ident = this.input.slice(next, pos);\n if (!keywordRelationalOperator.test(ident)) { return true }\n }\n return false\n };\n\n // check 'async [no LineTerminator here] function'\n // - 'async /*foo*/ function' is OK.\n // - 'async /*\\n*/ function' is invalid.\n pp$8.isAsyncFunction = function() {\n if (this.options.ecmaVersion < 8 || !this.isContextual(\"async\"))\n { return false }\n\n skipWhiteSpace.lastIndex = this.pos;\n var skip = skipWhiteSpace.exec(this.input);\n var next = this.pos + skip[0].length, after;\n return !lineBreak.test(this.input.slice(this.pos, next)) &&\n this.input.slice(next, next + 8) === \"function\" &&\n (next + 8 === this.input.length ||\n !(isIdentifierChar(after = this.input.charCodeAt(next + 8)) || after > 0xd7ff && after < 0xdc00))\n };\n\n // Parse a single statement.\n //\n // If expecting a statement and finding a slash operator, parse a\n // regular expression literal. This is to handle cases like\n // `if (foo) /blah/.exec(foo)`, where looking at the previous token\n // does not help.\n\n pp$8.parseStatement = function(context, topLevel, exports) {\n var starttype = this.type, node = this.startNode(), kind;\n\n if (this.isLet(context)) {\n starttype = types$1._var;\n kind = \"let\";\n }\n\n // Most types of statements are recognized by the keyword they\n // start with. Many are trivial to parse, some require a bit of\n // complexity.\n\n switch (starttype) {\n case types$1._break: case types$1._continue: return this.parseBreakContinueStatement(node, starttype.keyword)\n case types$1._debugger: return this.parseDebuggerStatement(node)\n case types$1._do: return this.parseDoStatement(node)\n case types$1._for: return this.parseForStatement(node)\n case types$1._function:\n // Function as sole body of either an if statement or a labeled statement\n // works, but not when it is part of a labeled statement that is the sole\n // body of an if statement.\n if ((context && (this.strict || context !== \"if\" && context !== \"label\")) && this.options.ecmaVersion >= 6) { this.unexpected(); }\n return this.parseFunctionStatement(node, false, !context)\n case types$1._class:\n if (context) { this.unexpected(); }\n return this.parseClass(node, true)\n case types$1._if: return this.parseIfStatement(node)\n case types$1._return: return this.parseReturnStatement(node)\n case types$1._switch: return this.parseSwitchStatement(node)\n case types$1._throw: return this.parseThrowStatement(node)\n case types$1._try: return this.parseTryStatement(node)\n case types$1._const: case types$1._var:\n kind = kind || this.value;\n if (context && kind !== \"var\") { this.unexpected(); }\n return this.parseVarStatement(node, kind)\n case types$1._while: return this.parseWhileStatement(node)\n case types$1._with: return this.parseWithStatement(node)\n case types$1.braceL: return this.parseBlock(true, node)\n case types$1.semi: return this.parseEmptyStatement(node)\n case types$1._export:\n case types$1._import:\n if (this.options.ecmaVersion > 10 && starttype === types$1._import) {\n skipWhiteSpace.lastIndex = this.pos;\n var skip = skipWhiteSpace.exec(this.input);\n var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next);\n if (nextCh === 40 || nextCh === 46) // '(' or '.'\n { return this.parseExpressionStatement(node, this.parseExpression()) }\n }\n\n if (!this.options.allowImportExportEverywhere) {\n if (!topLevel)\n { this.raise(this.start, \"'import' and 'export' may only appear at the top level\"); }\n if (!this.inModule)\n { this.raise(this.start, \"'import' and 'export' may appear only with 'sourceType: module'\"); }\n }\n return starttype === types$1._import ? this.parseImport(node) : this.parseExport(node, exports)\n\n // If the statement does not start with a statement keyword or a\n // brace, it's an ExpressionStatement or LabeledStatement. We\n // simply start parsing an expression, and afterwards, if the\n // next token is a colon and the expression was a simple\n // Identifier node, we switch to interpreting it as a label.\n default:\n if (this.isAsyncFunction()) {\n if (context) { this.unexpected(); }\n this.next();\n return this.parseFunctionStatement(node, true, !context)\n }\n\n var maybeName = this.value, expr = this.parseExpression();\n if (starttype === types$1.name && expr.type === \"Identifier\" && this.eat(types$1.colon))\n { return this.parseLabeledStatement(node, maybeName, expr, context) }\n else { return this.parseExpressionStatement(node, expr) }\n }\n };\n\n pp$8.parseBreakContinueStatement = function(node, keyword) {\n var isBreak = keyword === \"break\";\n this.next();\n if (this.eat(types$1.semi) || this.insertSemicolon()) { node.label = null; }\n else if (this.type !== types$1.name) { this.unexpected(); }\n else {\n node.label = this.parseIdent();\n this.semicolon();\n }\n\n // Verify that there is an actual destination to break or\n // continue to.\n var i = 0;\n for (; i < this.labels.length; ++i) {\n var lab = this.labels[i];\n if (node.label == null || lab.name === node.label.name) {\n if (lab.kind != null && (isBreak || lab.kind === \"loop\")) { break }\n if (node.label && isBreak) { break }\n }\n }\n if (i === this.labels.length) { this.raise(node.start, \"Unsyntactic \" + keyword); }\n return this.finishNode(node, isBreak ? \"BreakStatement\" : \"ContinueStatement\")\n };\n\n pp$8.parseDebuggerStatement = function(node) {\n this.next();\n this.semicolon();\n return this.finishNode(node, \"DebuggerStatement\")\n };\n\n pp$8.parseDoStatement = function(node) {\n this.next();\n this.labels.push(loopLabel);\n node.body = this.parseStatement(\"do\");\n this.labels.pop();\n this.expect(types$1._while);\n node.test = this.parseParenExpression();\n if (this.options.ecmaVersion >= 6)\n { this.eat(types$1.semi); }\n else\n { this.semicolon(); }\n return this.finishNode(node, \"DoWhileStatement\")\n };\n\n // Disambiguating between a `for` and a `for`/`in` or `for`/`of`\n // loop is non-trivial. Basically, we have to parse the init `var`\n // statement or expression, disallowing the `in` operator (see\n // the second parameter to `parseExpression`), and then check\n // whether the next token is `in` or `of`. When there is no init\n // part (semicolon immediately after the opening parenthesis), it\n // is a regular `for` loop.\n\n pp$8.parseForStatement = function(node) {\n this.next();\n var awaitAt = (this.options.ecmaVersion >= 9 && this.canAwait && this.eatContextual(\"await\")) ? this.lastTokStart : -1;\n this.labels.push(loopLabel);\n this.enterScope(0);\n this.expect(types$1.parenL);\n if (this.type === types$1.semi) {\n if (awaitAt > -1) { this.unexpected(awaitAt); }\n return this.parseFor(node, null)\n }\n var isLet = this.isLet();\n if (this.type === types$1._var || this.type === types$1._const || isLet) {\n var init$1 = this.startNode(), kind = isLet ? \"let\" : this.value;\n this.next();\n this.parseVar(init$1, true, kind);\n this.finishNode(init$1, \"VariableDeclaration\");\n if ((this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual(\"of\"))) && init$1.declarations.length === 1) {\n if (this.options.ecmaVersion >= 9) {\n if (this.type === types$1._in) {\n if (awaitAt > -1) { this.unexpected(awaitAt); }\n } else { node.await = awaitAt > -1; }\n }\n return this.parseForIn(node, init$1)\n }\n if (awaitAt > -1) { this.unexpected(awaitAt); }\n return this.parseFor(node, init$1)\n }\n var startsWithLet = this.isContextual(\"let\"), isForOf = false;\n var containsEsc = this.containsEsc;\n var refDestructuringErrors = new DestructuringErrors;\n var initPos = this.start;\n var init = awaitAt > -1\n ? this.parseExprSubscripts(refDestructuringErrors, \"await\")\n : this.parseExpression(true, refDestructuringErrors);\n if (this.type === types$1._in || (isForOf = this.options.ecmaVersion >= 6 && this.isContextual(\"of\"))) {\n if (awaitAt > -1) { // implies `ecmaVersion >= 9` (see declaration of awaitAt)\n if (this.type === types$1._in) { this.unexpected(awaitAt); }\n node.await = true;\n } else if (isForOf && this.options.ecmaVersion >= 8) {\n if (init.start === initPos && !containsEsc && init.type === \"Identifier\" && init.name === \"async\") { this.unexpected(); }\n else if (this.options.ecmaVersion >= 9) { node.await = false; }\n }\n if (startsWithLet && isForOf) { this.raise(init.start, \"The left-hand side of a for-of loop may not start with 'let'.\"); }\n this.toAssignable(init, false, refDestructuringErrors);\n this.checkLValPattern(init);\n return this.parseForIn(node, init)\n } else {\n this.checkExpressionErrors(refDestructuringErrors, true);\n }\n if (awaitAt > -1) { this.unexpected(awaitAt); }\n return this.parseFor(node, init)\n };\n\n pp$8.parseFunctionStatement = function(node, isAsync, declarationPosition) {\n this.next();\n return this.parseFunction(node, FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT), false, isAsync)\n };\n\n pp$8.parseIfStatement = function(node) {\n this.next();\n node.test = this.parseParenExpression();\n // allow function declarations in branches, but only in non-strict mode\n node.consequent = this.parseStatement(\"if\");\n node.alternate = this.eat(types$1._else) ? this.parseStatement(\"if\") : null;\n return this.finishNode(node, \"IfStatement\")\n };\n\n pp$8.parseReturnStatement = function(node) {\n if (!this.inFunction && !this.options.allowReturnOutsideFunction)\n { this.raise(this.start, \"'return' outside of function\"); }\n this.next();\n\n // In `return` (and `break`/`continue`), the keywords with\n // optional arguments, we eagerly look for a semicolon or the\n // possibility to insert one.\n\n if (this.eat(types$1.semi) || this.insertSemicolon()) { node.argument = null; }\n else { node.argument = this.parseExpression(); this.semicolon(); }\n return this.finishNode(node, \"ReturnStatement\")\n };\n\n pp$8.parseSwitchStatement = function(node) {\n this.next();\n node.discriminant = this.parseParenExpression();\n node.cases = [];\n this.expect(types$1.braceL);\n this.labels.push(switchLabel);\n this.enterScope(0);\n\n // Statements under must be grouped (by label) in SwitchCase\n // nodes. `cur` is used to keep the node that we are currently\n // adding statements to.\n\n var cur;\n for (var sawDefault = false; this.type !== types$1.braceR;) {\n if (this.type === types$1._case || this.type === types$1._default) {\n var isCase = this.type === types$1._case;\n if (cur) { this.finishNode(cur, \"SwitchCase\"); }\n node.cases.push(cur = this.startNode());\n cur.consequent = [];\n this.next();\n if (isCase) {\n cur.test = this.parseExpression();\n } else {\n if (sawDefault) { this.raiseRecoverable(this.lastTokStart, \"Multiple default clauses\"); }\n sawDefault = true;\n cur.test = null;\n }\n this.expect(types$1.colon);\n } else {\n if (!cur) { this.unexpected(); }\n cur.consequent.push(this.parseStatement(null));\n }\n }\n this.exitScope();\n if (cur) { this.finishNode(cur, \"SwitchCase\"); }\n this.next(); // Closing brace\n this.labels.pop();\n return this.finishNode(node, \"SwitchStatement\")\n };\n\n pp$8.parseThrowStatement = function(node) {\n this.next();\n if (lineBreak.test(this.input.slice(this.lastTokEnd, this.start)))\n { this.raise(this.lastTokEnd, \"Illegal newline after throw\"); }\n node.argument = this.parseExpression();\n this.semicolon();\n return this.finishNode(node, \"ThrowStatement\")\n };\n\n // Reused empty array added for node fields that are always empty.\n\n var empty$1 = [];\n\n pp$8.parseCatchClauseParam = function() {\n var param = this.parseBindingAtom();\n var simple = param.type === \"Identifier\";\n this.enterScope(simple ? SCOPE_SIMPLE_CATCH : 0);\n this.checkLValPattern(param, simple ? BIND_SIMPLE_CATCH : BIND_LEXICAL);\n this.expect(types$1.parenR);\n\n return param\n };\n\n pp$8.parseTryStatement = function(node) {\n this.next();\n node.block = this.parseBlock();\n node.handler = null;\n if (this.type === types$1._catch) {\n var clause = this.startNode();\n this.next();\n if (this.eat(types$1.parenL)) {\n clause.param = this.parseCatchClauseParam();\n } else {\n if (this.options.ecmaVersion < 10) { this.unexpected(); }\n clause.param = null;\n this.enterScope(0);\n }\n clause.body = this.parseBlock(false);\n this.exitScope();\n node.handler = this.finishNode(clause, \"CatchClause\");\n }\n node.finalizer = this.eat(types$1._finally) ? this.parseBlock() : null;\n if (!node.handler && !node.finalizer)\n { this.raise(node.start, \"Missing catch or finally clause\"); }\n return this.finishNode(node, \"TryStatement\")\n };\n\n pp$8.parseVarStatement = function(node, kind, allowMissingInitializer) {\n this.next();\n this.parseVar(node, false, kind, allowMissingInitializer);\n this.semicolon();\n return this.finishNode(node, \"VariableDeclaration\")\n };\n\n pp$8.parseWhileStatement = function(node) {\n this.next();\n node.test = this.parseParenExpression();\n this.labels.push(loopLabel);\n node.body = this.parseStatement(\"while\");\n this.labels.pop();\n return this.finishNode(node, \"WhileStatement\")\n };\n\n pp$8.parseWithStatement = function(node) {\n if (this.strict) { this.raise(this.start, \"'with' in strict mode\"); }\n this.next();\n node.object = this.parseParenExpression();\n node.body = this.parseStatement(\"with\");\n return this.finishNode(node, \"WithStatement\")\n };\n\n pp$8.parseEmptyStatement = function(node) {\n this.next();\n return this.finishNode(node, \"EmptyStatement\")\n };\n\n pp$8.parseLabeledStatement = function(node, maybeName, expr, context) {\n for (var i$1 = 0, list = this.labels; i$1 < list.length; i$1 += 1)\n {\n var label = list[i$1];\n\n if (label.name === maybeName)\n { this.raise(expr.start, \"Label '\" + maybeName + \"' is already declared\");\n } }\n var kind = this.type.isLoop ? \"loop\" : this.type === types$1._switch ? \"switch\" : null;\n for (var i = this.labels.length - 1; i >= 0; i--) {\n var label$1 = this.labels[i];\n if (label$1.statementStart === node.start) {\n // Update information about previous labels on this node\n label$1.statementStart = this.start;\n label$1.kind = kind;\n } else { break }\n }\n this.labels.push({name: maybeName, kind: kind, statementStart: this.start});\n node.body = this.parseStatement(context ? context.indexOf(\"label\") === -1 ? context + \"label\" : context : \"label\");\n this.labels.pop();\n node.label = expr;\n return this.finishNode(node, \"LabeledStatement\")\n };\n\n pp$8.parseExpressionStatement = function(node, expr) {\n node.expression = expr;\n this.semicolon();\n return this.finishNode(node, \"ExpressionStatement\")\n };\n\n // Parse a semicolon-enclosed block of statements, handling `\"use\n // strict\"` declarations when `allowStrict` is true (used for\n // function bodies).\n\n pp$8.parseBlock = function(createNewLexicalScope, node, exitStrict) {\n if ( createNewLexicalScope === void 0 ) createNewLexicalScope = true;\n if ( node === void 0 ) node = this.startNode();\n\n node.body = [];\n this.expect(types$1.braceL);\n if (createNewLexicalScope) { this.enterScope(0); }\n while (this.type !== types$1.braceR) {\n var stmt = this.parseStatement(null);\n node.body.push(stmt);\n }\n if (exitStrict) { this.strict = false; }\n this.next();\n if (createNewLexicalScope) { this.exitScope(); }\n return this.finishNode(node, \"BlockStatement\")\n };\n\n // Parse a regular `for` loop. The disambiguation code in\n // `parseStatement` will already have parsed the init statement or\n // expression.\n\n pp$8.parseFor = function(node, init) {\n node.init = init;\n this.expect(types$1.semi);\n node.test = this.type === types$1.semi ? null : this.parseExpression();\n this.expect(types$1.semi);\n node.update = this.type === types$1.parenR ? null : this.parseExpression();\n this.expect(types$1.parenR);\n node.body = this.parseStatement(\"for\");\n this.exitScope();\n this.labels.pop();\n return this.finishNode(node, \"ForStatement\")\n };\n\n // Parse a `for`/`in` and `for`/`of` loop, which are almost\n // same from parser's perspective.\n\n pp$8.parseForIn = function(node, init) {\n var isForIn = this.type === types$1._in;\n this.next();\n\n if (\n init.type === \"VariableDeclaration\" &&\n init.declarations[0].init != null &&\n (\n !isForIn ||\n this.options.ecmaVersion < 8 ||\n this.strict ||\n init.kind !== \"var\" ||\n init.declarations[0].id.type !== \"Identifier\"\n )\n ) {\n this.raise(\n init.start,\n ((isForIn ? \"for-in\" : \"for-of\") + \" loop variable declaration may not have an initializer\")\n );\n }\n node.left = init;\n node.right = isForIn ? this.parseExpression() : this.parseMaybeAssign();\n this.expect(types$1.parenR);\n node.body = this.parseStatement(\"for\");\n this.exitScope();\n this.labels.pop();\n return this.finishNode(node, isForIn ? \"ForInStatement\" : \"ForOfStatement\")\n };\n\n // Parse a list of variable declarations.\n\n pp$8.parseVar = function(node, isFor, kind, allowMissingInitializer) {\n node.declarations = [];\n node.kind = kind;\n for (;;) {\n var decl = this.startNode();\n this.parseVarId(decl, kind);\n if (this.eat(types$1.eq)) {\n decl.init = this.parseMaybeAssign(isFor);\n } else if (!allowMissingInitializer && kind === \"const\" && !(this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual(\"of\")))) {\n this.unexpected();\n } else if (!allowMissingInitializer && decl.id.type !== \"Identifier\" && !(isFor && (this.type === types$1._in || this.isContextual(\"of\")))) {\n this.raise(this.lastTokEnd, \"Complex binding patterns require an initialization value\");\n } else {\n decl.init = null;\n }\n node.declarations.push(this.finishNode(decl, \"VariableDeclarator\"));\n if (!this.eat(types$1.comma)) { break }\n }\n return node\n };\n\n pp$8.parseVarId = function(decl, kind) {\n decl.id = this.parseBindingAtom();\n this.checkLValPattern(decl.id, kind === \"var\" ? BIND_VAR : BIND_LEXICAL, false);\n };\n\n var FUNC_STATEMENT = 1, FUNC_HANGING_STATEMENT = 2, FUNC_NULLABLE_ID = 4;\n\n // Parse a function declaration or literal (depending on the\n // `statement & FUNC_STATEMENT`).\n\n // Remove `allowExpressionBody` for 7.0.0, as it is only called with false\n pp$8.parseFunction = function(node, statement, allowExpressionBody, isAsync, forInit) {\n this.initFunction(node);\n if (this.options.ecmaVersion >= 9 || this.options.ecmaVersion >= 6 && !isAsync) {\n if (this.type === types$1.star && (statement & FUNC_HANGING_STATEMENT))\n { this.unexpected(); }\n node.generator = this.eat(types$1.star);\n }\n if (this.options.ecmaVersion >= 8)\n { node.async = !!isAsync; }\n\n if (statement & FUNC_STATEMENT) {\n node.id = (statement & FUNC_NULLABLE_ID) && this.type !== types$1.name ? null : this.parseIdent();\n if (node.id && !(statement & FUNC_HANGING_STATEMENT))\n // If it is a regular function declaration in sloppy mode, then it is\n // subject to Annex B semantics (BIND_FUNCTION). Otherwise, the binding\n // mode depends on properties of the current scope (see\n // treatFunctionsAsVar).\n { this.checkLValSimple(node.id, (this.strict || node.generator || node.async) ? this.treatFunctionsAsVar ? BIND_VAR : BIND_LEXICAL : BIND_FUNCTION); }\n }\n\n var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n this.yieldPos = 0;\n this.awaitPos = 0;\n this.awaitIdentPos = 0;\n this.enterScope(functionFlags(node.async, node.generator));\n\n if (!(statement & FUNC_STATEMENT))\n { node.id = this.type === types$1.name ? this.parseIdent() : null; }\n\n this.parseFunctionParams(node);\n this.parseFunctionBody(node, allowExpressionBody, false, forInit);\n\n this.yieldPos = oldYieldPos;\n this.awaitPos = oldAwaitPos;\n this.awaitIdentPos = oldAwaitIdentPos;\n return this.finishNode(node, (statement & FUNC_STATEMENT) ? \"FunctionDeclaration\" : \"FunctionExpression\")\n };\n\n pp$8.parseFunctionParams = function(node) {\n this.expect(types$1.parenL);\n node.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8);\n this.checkYieldAwaitInDefaultParams();\n };\n\n // Parse a class declaration or literal (depending on the\n // `isStatement` parameter).\n\n pp$8.parseClass = function(node, isStatement) {\n this.next();\n\n // ecma-262 14.6 Class Definitions\n // A class definition is always strict mode code.\n var oldStrict = this.strict;\n this.strict = true;\n\n this.parseClassId(node, isStatement);\n this.parseClassSuper(node);\n var privateNameMap = this.enterClassBody();\n var classBody = this.startNode();\n var hadConstructor = false;\n classBody.body = [];\n this.expect(types$1.braceL);\n while (this.type !== types$1.braceR) {\n var element = this.parseClassElement(node.superClass !== null);\n if (element) {\n classBody.body.push(element);\n if (element.type === \"MethodDefinition\" && element.kind === \"constructor\") {\n if (hadConstructor) { this.raiseRecoverable(element.start, \"Duplicate constructor in the same class\"); }\n hadConstructor = true;\n } else if (element.key && element.key.type === \"PrivateIdentifier\" && isPrivateNameConflicted(privateNameMap, element)) {\n this.raiseRecoverable(element.key.start, (\"Identifier '#\" + (element.key.name) + \"' has already been declared\"));\n }\n }\n }\n this.strict = oldStrict;\n this.next();\n node.body = this.finishNode(classBody, \"ClassBody\");\n this.exitClassBody();\n return this.finishNode(node, isStatement ? \"ClassDeclaration\" : \"ClassExpression\")\n };\n\n pp$8.parseClassElement = function(constructorAllowsSuper) {\n if (this.eat(types$1.semi)) { return null }\n\n var ecmaVersion = this.options.ecmaVersion;\n var node = this.startNode();\n var keyName = \"\";\n var isGenerator = false;\n var isAsync = false;\n var kind = \"method\";\n var isStatic = false;\n\n if (this.eatContextual(\"static\")) {\n // Parse static init block\n if (ecmaVersion >= 13 && this.eat(types$1.braceL)) {\n this.parseClassStaticBlock(node);\n return node\n }\n if (this.isClassElementNameStart() || this.type === types$1.star) {\n isStatic = true;\n } else {\n keyName = \"static\";\n }\n }\n node.static = isStatic;\n if (!keyName && ecmaVersion >= 8 && this.eatContextual(\"async\")) {\n if ((this.isClassElementNameStart() || this.type === types$1.star) && !this.canInsertSemicolon()) {\n isAsync = true;\n } else {\n keyName = \"async\";\n }\n }\n if (!keyName && (ecmaVersion >= 9 || !isAsync) && this.eat(types$1.star)) {\n isGenerator = true;\n }\n if (!keyName && !isAsync && !isGenerator) {\n var lastValue = this.value;\n if (this.eatContextual(\"get\") || this.eatContextual(\"set\")) {\n if (this.isClassElementNameStart()) {\n kind = lastValue;\n } else {\n keyName = lastValue;\n }\n }\n }\n\n // Parse element name\n if (keyName) {\n // 'async', 'get', 'set', or 'static' were not a keyword contextually.\n // The last token is any of those. Make it the element name.\n node.computed = false;\n node.key = this.startNodeAt(this.lastTokStart, this.lastTokStartLoc);\n node.key.name = keyName;\n this.finishNode(node.key, \"Identifier\");\n } else {\n this.parseClassElementName(node);\n }\n\n // Parse element value\n if (ecmaVersion < 13 || this.type === types$1.parenL || kind !== \"method\" || isGenerator || isAsync) {\n var isConstructor = !node.static && checkKeyName(node, \"constructor\");\n var allowsDirectSuper = isConstructor && constructorAllowsSuper;\n // Couldn't move this check into the 'parseClassMethod' method for backward compatibility.\n if (isConstructor && kind !== \"method\") { this.raise(node.key.start, \"Constructor can't have get/set modifier\"); }\n node.kind = isConstructor ? \"constructor\" : kind;\n this.parseClassMethod(node, isGenerator, isAsync, allowsDirectSuper);\n } else {\n this.parseClassField(node);\n }\n\n return node\n };\n\n pp$8.isClassElementNameStart = function() {\n return (\n this.type === types$1.name ||\n this.type === types$1.privateId ||\n this.type === types$1.num ||\n this.type === types$1.string ||\n this.type === types$1.bracketL ||\n this.type.keyword\n )\n };\n\n pp$8.parseClassElementName = function(element) {\n if (this.type === types$1.privateId) {\n if (this.value === \"constructor\") {\n this.raise(this.start, \"Classes can't have an element named '#constructor'\");\n }\n element.computed = false;\n element.key = this.parsePrivateIdent();\n } else {\n this.parsePropertyName(element);\n }\n };\n\n pp$8.parseClassMethod = function(method, isGenerator, isAsync, allowsDirectSuper) {\n // Check key and flags\n var key = method.key;\n if (method.kind === \"constructor\") {\n if (isGenerator) { this.raise(key.start, \"Constructor can't be a generator\"); }\n if (isAsync) { this.raise(key.start, \"Constructor can't be an async method\"); }\n } else if (method.static && checkKeyName(method, \"prototype\")) {\n this.raise(key.start, \"Classes may not have a static property named prototype\");\n }\n\n // Parse value\n var value = method.value = this.parseMethod(isGenerator, isAsync, allowsDirectSuper);\n\n // Check value\n if (method.kind === \"get\" && value.params.length !== 0)\n { this.raiseRecoverable(value.start, \"getter should have no params\"); }\n if (method.kind === \"set\" && value.params.length !== 1)\n { this.raiseRecoverable(value.start, \"setter should have exactly one param\"); }\n if (method.kind === \"set\" && value.params[0].type === \"RestElement\")\n { this.raiseRecoverable(value.params[0].start, \"Setter cannot use rest params\"); }\n\n return this.finishNode(method, \"MethodDefinition\")\n };\n\n pp$8.parseClassField = function(field) {\n if (checkKeyName(field, \"constructor\")) {\n this.raise(field.key.start, \"Classes can't have a field named 'constructor'\");\n } else if (field.static && checkKeyName(field, \"prototype\")) {\n this.raise(field.key.start, \"Classes can't have a static field named 'prototype'\");\n }\n\n if (this.eat(types$1.eq)) {\n // To raise SyntaxError if 'arguments' exists in the initializer.\n var scope = this.currentThisScope();\n var inClassFieldInit = scope.inClassFieldInit;\n scope.inClassFieldInit = true;\n field.value = this.parseMaybeAssign();\n scope.inClassFieldInit = inClassFieldInit;\n } else {\n field.value = null;\n }\n this.semicolon();\n\n return this.finishNode(field, \"PropertyDefinition\")\n };\n\n pp$8.parseClassStaticBlock = function(node) {\n node.body = [];\n\n var oldLabels = this.labels;\n this.labels = [];\n this.enterScope(SCOPE_CLASS_STATIC_BLOCK | SCOPE_SUPER);\n while (this.type !== types$1.braceR) {\n var stmt = this.parseStatement(null);\n node.body.push(stmt);\n }\n this.next();\n this.exitScope();\n this.labels = oldLabels;\n\n return this.finishNode(node, \"StaticBlock\")\n };\n\n pp$8.parseClassId = function(node, isStatement) {\n if (this.type === types$1.name) {\n node.id = this.parseIdent();\n if (isStatement)\n { this.checkLValSimple(node.id, BIND_LEXICAL, false); }\n } else {\n if (isStatement === true)\n { this.unexpected(); }\n node.id = null;\n }\n };\n\n pp$8.parseClassSuper = function(node) {\n node.superClass = this.eat(types$1._extends) ? this.parseExprSubscripts(null, false) : null;\n };\n\n pp$8.enterClassBody = function() {\n var element = {declared: Object.create(null), used: []};\n this.privateNameStack.push(element);\n return element.declared\n };\n\n pp$8.exitClassBody = function() {\n var ref = this.privateNameStack.pop();\n var declared = ref.declared;\n var used = ref.used;\n if (!this.options.checkPrivateFields) { return }\n var len = this.privateNameStack.length;\n var parent = len === 0 ? null : this.privateNameStack[len - 1];\n for (var i = 0; i < used.length; ++i) {\n var id = used[i];\n if (!hasOwn(declared, id.name)) {\n if (parent) {\n parent.used.push(id);\n } else {\n this.raiseRecoverable(id.start, (\"Private field '#\" + (id.name) + \"' must be declared in an enclosing class\"));\n }\n }\n }\n };\n\n function isPrivateNameConflicted(privateNameMap, element) {\n var name = element.key.name;\n var curr = privateNameMap[name];\n\n var next = \"true\";\n if (element.type === \"MethodDefinition\" && (element.kind === \"get\" || element.kind === \"set\")) {\n next = (element.static ? \"s\" : \"i\") + element.kind;\n }\n\n // `class { get #a(){}; static set #a(_){} }` is also conflict.\n if (\n curr === \"iget\" && next === \"iset\" ||\n curr === \"iset\" && next === \"iget\" ||\n curr === \"sget\" && next === \"sset\" ||\n curr === \"sset\" && next === \"sget\"\n ) {\n privateNameMap[name] = \"true\";\n return false\n } else if (!curr) {\n privateNameMap[name] = next;\n return false\n } else {\n return true\n }\n }\n\n function checkKeyName(node, name) {\n var computed = node.computed;\n var key = node.key;\n return !computed && (\n key.type === \"Identifier\" && key.name === name ||\n key.type === \"Literal\" && key.value === name\n )\n }\n\n // Parses module export declaration.\n\n pp$8.parseExportAllDeclaration = function(node, exports) {\n if (this.options.ecmaVersion >= 11) {\n if (this.eatContextual(\"as\")) {\n node.exported = this.parseModuleExportName();\n this.checkExport(exports, node.exported, this.lastTokStart);\n } else {\n node.exported = null;\n }\n }\n this.expectContextual(\"from\");\n if (this.type !== types$1.string) { this.unexpected(); }\n node.source = this.parseExprAtom();\n if (this.options.ecmaVersion >= 16)\n { node.attributes = this.parseWithClause(); }\n this.semicolon();\n return this.finishNode(node, \"ExportAllDeclaration\")\n };\n\n pp$8.parseExport = function(node, exports) {\n this.next();\n // export * from '...'\n if (this.eat(types$1.star)) {\n return this.parseExportAllDeclaration(node, exports)\n }\n if (this.eat(types$1._default)) { // export default ...\n this.checkExport(exports, \"default\", this.lastTokStart);\n node.declaration = this.parseExportDefaultDeclaration();\n return this.finishNode(node, \"ExportDefaultDeclaration\")\n }\n // export var|const|let|function|class ...\n if (this.shouldParseExportStatement()) {\n node.declaration = this.parseExportDeclaration(node);\n if (node.declaration.type === \"VariableDeclaration\")\n { this.checkVariableExport(exports, node.declaration.declarations); }\n else\n { this.checkExport(exports, node.declaration.id, node.declaration.id.start); }\n node.specifiers = [];\n node.source = null;\n } else { // export { x, y as z } [from '...']\n node.declaration = null;\n node.specifiers = this.parseExportSpecifiers(exports);\n if (this.eatContextual(\"from\")) {\n if (this.type !== types$1.string) { this.unexpected(); }\n node.source = this.parseExprAtom();\n if (this.options.ecmaVersion >= 16)\n { node.attributes = this.parseWithClause(); }\n } else {\n for (var i = 0, list = node.specifiers; i < list.length; i += 1) {\n // check for keywords used as local names\n var spec = list[i];\n\n this.checkUnreserved(spec.local);\n // check if export is defined\n this.checkLocalExport(spec.local);\n\n if (spec.local.type === \"Literal\") {\n this.raise(spec.local.start, \"A string literal cannot be used as an exported binding without `from`.\");\n }\n }\n\n node.source = null;\n }\n this.semicolon();\n }\n return this.finishNode(node, \"ExportNamedDeclaration\")\n };\n\n pp$8.parseExportDeclaration = function(node) {\n return this.parseStatement(null)\n };\n\n pp$8.parseExportDefaultDeclaration = function() {\n var isAsync;\n if (this.type === types$1._function || (isAsync = this.isAsyncFunction())) {\n var fNode = this.startNode();\n this.next();\n if (isAsync) { this.next(); }\n return this.parseFunction(fNode, FUNC_STATEMENT | FUNC_NULLABLE_ID, false, isAsync)\n } else if (this.type === types$1._class) {\n var cNode = this.startNode();\n return this.parseClass(cNode, \"nullableID\")\n } else {\n var declaration = this.parseMaybeAssign();\n this.semicolon();\n return declaration\n }\n };\n\n pp$8.checkExport = function(exports, name, pos) {\n if (!exports) { return }\n if (typeof name !== \"string\")\n { name = name.type === \"Identifier\" ? name.name : name.value; }\n if (hasOwn(exports, name))\n { this.raiseRecoverable(pos, \"Duplicate export '\" + name + \"'\"); }\n exports[name] = true;\n };\n\n pp$8.checkPatternExport = function(exports, pat) {\n var type = pat.type;\n if (type === \"Identifier\")\n { this.checkExport(exports, pat, pat.start); }\n else if (type === \"ObjectPattern\")\n { for (var i = 0, list = pat.properties; i < list.length; i += 1)\n {\n var prop = list[i];\n\n this.checkPatternExport(exports, prop);\n } }\n else if (type === \"ArrayPattern\")\n { for (var i$1 = 0, list$1 = pat.elements; i$1 < list$1.length; i$1 += 1) {\n var elt = list$1[i$1];\n\n if (elt) { this.checkPatternExport(exports, elt); }\n } }\n else if (type === \"Property\")\n { this.checkPatternExport(exports, pat.value); }\n else if (type === \"AssignmentPattern\")\n { this.checkPatternExport(exports, pat.left); }\n else if (type === \"RestElement\")\n { this.checkPatternExport(exports, pat.argument); }\n };\n\n pp$8.checkVariableExport = function(exports, decls) {\n if (!exports) { return }\n for (var i = 0, list = decls; i < list.length; i += 1)\n {\n var decl = list[i];\n\n this.checkPatternExport(exports, decl.id);\n }\n };\n\n pp$8.shouldParseExportStatement = function() {\n return this.type.keyword === \"var\" ||\n this.type.keyword === \"const\" ||\n this.type.keyword === \"class\" ||\n this.type.keyword === \"function\" ||\n this.isLet() ||\n this.isAsyncFunction()\n };\n\n // Parses a comma-separated list of module exports.\n\n pp$8.parseExportSpecifier = function(exports) {\n var node = this.startNode();\n node.local = this.parseModuleExportName();\n\n node.exported = this.eatContextual(\"as\") ? this.parseModuleExportName() : node.local;\n this.checkExport(\n exports,\n node.exported,\n node.exported.start\n );\n\n return this.finishNode(node, \"ExportSpecifier\")\n };\n\n pp$8.parseExportSpecifiers = function(exports) {\n var nodes = [], first = true;\n // export { x, y as z } [from '...']\n this.expect(types$1.braceL);\n while (!this.eat(types$1.braceR)) {\n if (!first) {\n this.expect(types$1.comma);\n if (this.afterTrailingComma(types$1.braceR)) { break }\n } else { first = false; }\n\n nodes.push(this.parseExportSpecifier(exports));\n }\n return nodes\n };\n\n // Parses import declaration.\n\n pp$8.parseImport = function(node) {\n this.next();\n\n // import '...'\n if (this.type === types$1.string) {\n node.specifiers = empty$1;\n node.source = this.parseExprAtom();\n } else {\n node.specifiers = this.parseImportSpecifiers();\n this.expectContextual(\"from\");\n node.source = this.type === types$1.string ? this.parseExprAtom() : this.unexpected();\n }\n if (this.options.ecmaVersion >= 16)\n { node.attributes = this.parseWithClause(); }\n this.semicolon();\n return this.finishNode(node, \"ImportDeclaration\")\n };\n\n // Parses a comma-separated list of module imports.\n\n pp$8.parseImportSpecifier = function() {\n var node = this.startNode();\n node.imported = this.parseModuleExportName();\n\n if (this.eatContextual(\"as\")) {\n node.local = this.parseIdent();\n } else {\n this.checkUnreserved(node.imported);\n node.local = node.imported;\n }\n this.checkLValSimple(node.local, BIND_LEXICAL);\n\n return this.finishNode(node, \"ImportSpecifier\")\n };\n\n pp$8.parseImportDefaultSpecifier = function() {\n // import defaultObj, { x, y as z } from '...'\n var node = this.startNode();\n node.local = this.parseIdent();\n this.checkLValSimple(node.local, BIND_LEXICAL);\n return this.finishNode(node, \"ImportDefaultSpecifier\")\n };\n\n pp$8.parseImportNamespaceSpecifier = function() {\n var node = this.startNode();\n this.next();\n this.expectContextual(\"as\");\n node.local = this.parseIdent();\n this.checkLValSimple(node.local, BIND_LEXICAL);\n return this.finishNode(node, \"ImportNamespaceSpecifier\")\n };\n\n pp$8.parseImportSpecifiers = function() {\n var nodes = [], first = true;\n if (this.type === types$1.name) {\n nodes.push(this.parseImportDefaultSpecifier());\n if (!this.eat(types$1.comma)) { return nodes }\n }\n if (this.type === types$1.star) {\n nodes.push(this.parseImportNamespaceSpecifier());\n return nodes\n }\n this.expect(types$1.braceL);\n while (!this.eat(types$1.braceR)) {\n if (!first) {\n this.expect(types$1.comma);\n if (this.afterTrailingComma(types$1.braceR)) { break }\n } else { first = false; }\n\n nodes.push(this.parseImportSpecifier());\n }\n return nodes\n };\n\n pp$8.parseWithClause = function() {\n var nodes = [];\n if (!this.eat(types$1._with)) {\n return nodes\n }\n this.expect(types$1.braceL);\n var attributeKeys = {};\n var first = true;\n while (!this.eat(types$1.braceR)) {\n if (!first) {\n this.expect(types$1.comma);\n if (this.afterTrailingComma(types$1.braceR)) { break }\n } else { first = false; }\n\n var attr = this.parseImportAttribute();\n var keyName = attr.key.type === \"Identifier\" ? attr.key.name : attr.key.value;\n if (hasOwn(attributeKeys, keyName))\n { this.raiseRecoverable(attr.key.start, \"Duplicate attribute key '\" + keyName + \"'\"); }\n attributeKeys[keyName] = true;\n nodes.push(attr);\n }\n return nodes\n };\n\n pp$8.parseImportAttribute = function() {\n var node = this.startNode();\n node.key = this.type === types$1.string ? this.parseExprAtom() : this.parseIdent(this.options.allowReserved !== \"never\");\n this.expect(types$1.colon);\n if (this.type !== types$1.string) {\n this.unexpected();\n }\n node.value = this.parseExprAtom();\n return this.finishNode(node, \"ImportAttribute\")\n };\n\n pp$8.parseModuleExportName = function() {\n if (this.options.ecmaVersion >= 13 && this.type === types$1.string) {\n var stringLiteral = this.parseLiteral(this.value);\n if (loneSurrogate.test(stringLiteral.value)) {\n this.raise(stringLiteral.start, \"An export name cannot include a lone surrogate.\");\n }\n return stringLiteral\n }\n return this.parseIdent(true)\n };\n\n // Set `ExpressionStatement#directive` property for directive prologues.\n pp$8.adaptDirectivePrologue = function(statements) {\n for (var i = 0; i < statements.length && this.isDirectiveCandidate(statements[i]); ++i) {\n statements[i].directive = statements[i].expression.raw.slice(1, -1);\n }\n };\n pp$8.isDirectiveCandidate = function(statement) {\n return (\n this.options.ecmaVersion >= 5 &&\n statement.type === \"ExpressionStatement\" &&\n statement.expression.type === \"Literal\" &&\n typeof statement.expression.value === \"string\" &&\n // Reject parenthesized strings.\n (this.input[statement.start] === \"\\\"\" || this.input[statement.start] === \"'\")\n )\n };\n\n var pp$7 = Parser.prototype;\n\n // Convert existing expression atom to assignable pattern\n // if possible.\n\n pp$7.toAssignable = function(node, isBinding, refDestructuringErrors) {\n if (this.options.ecmaVersion >= 6 && node) {\n switch (node.type) {\n case \"Identifier\":\n if (this.inAsync && node.name === \"await\")\n { this.raise(node.start, \"Cannot use 'await' as identifier inside an async function\"); }\n break\n\n case \"ObjectPattern\":\n case \"ArrayPattern\":\n case \"AssignmentPattern\":\n case \"RestElement\":\n break\n\n case \"ObjectExpression\":\n node.type = \"ObjectPattern\";\n if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }\n for (var i = 0, list = node.properties; i < list.length; i += 1) {\n var prop = list[i];\n\n this.toAssignable(prop, isBinding);\n // Early error:\n // AssignmentRestProperty[Yield, Await] :\n // `...` DestructuringAssignmentTarget[Yield, Await]\n //\n // It is a Syntax Error if |DestructuringAssignmentTarget| is an |ArrayLiteral| or an |ObjectLiteral|.\n if (\n prop.type === \"RestElement\" &&\n (prop.argument.type === \"ArrayPattern\" || prop.argument.type === \"ObjectPattern\")\n ) {\n this.raise(prop.argument.start, \"Unexpected token\");\n }\n }\n break\n\n case \"Property\":\n // AssignmentProperty has type === \"Property\"\n if (node.kind !== \"init\") { this.raise(node.key.start, \"Object pattern can't contain getter or setter\"); }\n this.toAssignable(node.value, isBinding);\n break\n\n case \"ArrayExpression\":\n node.type = \"ArrayPattern\";\n if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }\n this.toAssignableList(node.elements, isBinding);\n break\n\n case \"SpreadElement\":\n node.type = \"RestElement\";\n this.toAssignable(node.argument, isBinding);\n if (node.argument.type === \"AssignmentPattern\")\n { this.raise(node.argument.start, \"Rest elements cannot have a default value\"); }\n break\n\n case \"AssignmentExpression\":\n if (node.operator !== \"=\") { this.raise(node.left.end, \"Only '=' operator can be used for specifying default value.\"); }\n node.type = \"AssignmentPattern\";\n delete node.operator;\n this.toAssignable(node.left, isBinding);\n break\n\n case \"ParenthesizedExpression\":\n this.toAssignable(node.expression, isBinding, refDestructuringErrors);\n break\n\n case \"ChainExpression\":\n this.raiseRecoverable(node.start, \"Optional chaining cannot appear in left-hand side\");\n break\n\n case \"MemberExpression\":\n if (!isBinding) { break }\n\n default:\n this.raise(node.start, \"Assigning to rvalue\");\n }\n } else if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }\n return node\n };\n\n // Convert list of expression atoms to binding list.\n\n pp$7.toAssignableList = function(exprList, isBinding) {\n var end = exprList.length;\n for (var i = 0; i < end; i++) {\n var elt = exprList[i];\n if (elt) { this.toAssignable(elt, isBinding); }\n }\n if (end) {\n var last = exprList[end - 1];\n if (this.options.ecmaVersion === 6 && isBinding && last && last.type === \"RestElement\" && last.argument.type !== \"Identifier\")\n { this.unexpected(last.argument.start); }\n }\n return exprList\n };\n\n // Parses spread element.\n\n pp$7.parseSpread = function(refDestructuringErrors) {\n var node = this.startNode();\n this.next();\n node.argument = this.parseMaybeAssign(false, refDestructuringErrors);\n return this.finishNode(node, \"SpreadElement\")\n };\n\n pp$7.parseRestBinding = function() {\n var node = this.startNode();\n this.next();\n\n // RestElement inside of a function parameter must be an identifier\n if (this.options.ecmaVersion === 6 && this.type !== types$1.name)\n { this.unexpected(); }\n\n node.argument = this.parseBindingAtom();\n\n return this.finishNode(node, \"RestElement\")\n };\n\n // Parses lvalue (assignable) atom.\n\n pp$7.parseBindingAtom = function() {\n if (this.options.ecmaVersion >= 6) {\n switch (this.type) {\n case types$1.bracketL:\n var node = this.startNode();\n this.next();\n node.elements = this.parseBindingList(types$1.bracketR, true, true);\n return this.finishNode(node, \"ArrayPattern\")\n\n case types$1.braceL:\n return this.parseObj(true)\n }\n }\n return this.parseIdent()\n };\n\n pp$7.parseBindingList = function(close, allowEmpty, allowTrailingComma, allowModifiers) {\n var elts = [], first = true;\n while (!this.eat(close)) {\n if (first) { first = false; }\n else { this.expect(types$1.comma); }\n if (allowEmpty && this.type === types$1.comma) {\n elts.push(null);\n } else if (allowTrailingComma && this.afterTrailingComma(close)) {\n break\n } else if (this.type === types$1.ellipsis) {\n var rest = this.parseRestBinding();\n this.parseBindingListItem(rest);\n elts.push(rest);\n if (this.type === types$1.comma) { this.raiseRecoverable(this.start, \"Comma is not permitted after the rest element\"); }\n this.expect(close);\n break\n } else {\n elts.push(this.parseAssignableListItem(allowModifiers));\n }\n }\n return elts\n };\n\n pp$7.parseAssignableListItem = function(allowModifiers) {\n var elem = this.parseMaybeDefault(this.start, this.startLoc);\n this.parseBindingListItem(elem);\n return elem\n };\n\n pp$7.parseBindingListItem = function(param) {\n return param\n };\n\n // Parses assignment pattern around given atom if possible.\n\n pp$7.parseMaybeDefault = function(startPos, startLoc, left) {\n left = left || this.parseBindingAtom();\n if (this.options.ecmaVersion < 6 || !this.eat(types$1.eq)) { return left }\n var node = this.startNodeAt(startPos, startLoc);\n node.left = left;\n node.right = this.parseMaybeAssign();\n return this.finishNode(node, \"AssignmentPattern\")\n };\n\n // The following three functions all verify that a node is an lvalue —\n // something that can be bound, or assigned to. In order to do so, they perform\n // a variety of checks:\n //\n // - Check that none of the bound/assigned-to identifiers are reserved words.\n // - Record name declarations for bindings in the appropriate scope.\n // - Check duplicate argument names, if checkClashes is set.\n //\n // If a complex binding pattern is encountered (e.g., object and array\n // destructuring), the entire pattern is recursively checked.\n //\n // There are three versions of checkLVal*() appropriate for different\n // circumstances:\n //\n // - checkLValSimple() shall be used if the syntactic construct supports\n // nothing other than identifiers and member expressions. Parenthesized\n // expressions are also correctly handled. This is generally appropriate for\n // constructs for which the spec says\n //\n // > It is a Syntax Error if AssignmentTargetType of [the production] is not\n // > simple.\n //\n // It is also appropriate for checking if an identifier is valid and not\n // defined elsewhere, like import declarations or function/class identifiers.\n //\n // Examples where this is used include:\n // a += …;\n // import a from '…';\n // where a is the node to be checked.\n //\n // - checkLValPattern() shall be used if the syntactic construct supports\n // anything checkLValSimple() supports, as well as object and array\n // destructuring patterns. This is generally appropriate for constructs for\n // which the spec says\n //\n // > It is a Syntax Error if [the production] is neither an ObjectLiteral nor\n // > an ArrayLiteral and AssignmentTargetType of [the production] is not\n // > simple.\n //\n // Examples where this is used include:\n // (a = …);\n // const a = …;\n // try { … } catch (a) { … }\n // where a is the node to be checked.\n //\n // - checkLValInnerPattern() shall be used if the syntactic construct supports\n // anything checkLValPattern() supports, as well as default assignment\n // patterns, rest elements, and other constructs that may appear within an\n // object or array destructuring pattern.\n //\n // As a special case, function parameters also use checkLValInnerPattern(),\n // as they also support defaults and rest constructs.\n //\n // These functions deliberately support both assignment and binding constructs,\n // as the logic for both is exceedingly similar. If the node is the target of\n // an assignment, then bindingType should be set to BIND_NONE. Otherwise, it\n // should be set to the appropriate BIND_* constant, like BIND_VAR or\n // BIND_LEXICAL.\n //\n // If the function is called with a non-BIND_NONE bindingType, then\n // additionally a checkClashes object may be specified to allow checking for\n // duplicate argument names. checkClashes is ignored if the provided construct\n // is an assignment (i.e., bindingType is BIND_NONE).\n\n pp$7.checkLValSimple = function(expr, bindingType, checkClashes) {\n if ( bindingType === void 0 ) bindingType = BIND_NONE;\n\n var isBind = bindingType !== BIND_NONE;\n\n switch (expr.type) {\n case \"Identifier\":\n if (this.strict && this.reservedWordsStrictBind.test(expr.name))\n { this.raiseRecoverable(expr.start, (isBind ? \"Binding \" : \"Assigning to \") + expr.name + \" in strict mode\"); }\n if (isBind) {\n if (bindingType === BIND_LEXICAL && expr.name === \"let\")\n { this.raiseRecoverable(expr.start, \"let is disallowed as a lexically bound name\"); }\n if (checkClashes) {\n if (hasOwn(checkClashes, expr.name))\n { this.raiseRecoverable(expr.start, \"Argument name clash\"); }\n checkClashes[expr.name] = true;\n }\n if (bindingType !== BIND_OUTSIDE) { this.declareName(expr.name, bindingType, expr.start); }\n }\n break\n\n case \"ChainExpression\":\n this.raiseRecoverable(expr.start, \"Optional chaining cannot appear in left-hand side\");\n break\n\n case \"MemberExpression\":\n if (isBind) { this.raiseRecoverable(expr.start, \"Binding member expression\"); }\n break\n\n case \"ParenthesizedExpression\":\n if (isBind) { this.raiseRecoverable(expr.start, \"Binding parenthesized expression\"); }\n return this.checkLValSimple(expr.expression, bindingType, checkClashes)\n\n default:\n this.raise(expr.start, (isBind ? \"Binding\" : \"Assigning to\") + \" rvalue\");\n }\n };\n\n pp$7.checkLValPattern = function(expr, bindingType, checkClashes) {\n if ( bindingType === void 0 ) bindingType = BIND_NONE;\n\n switch (expr.type) {\n case \"ObjectPattern\":\n for (var i = 0, list = expr.properties; i < list.length; i += 1) {\n var prop = list[i];\n\n this.checkLValInnerPattern(prop, bindingType, checkClashes);\n }\n break\n\n case \"ArrayPattern\":\n for (var i$1 = 0, list$1 = expr.elements; i$1 < list$1.length; i$1 += 1) {\n var elem = list$1[i$1];\n\n if (elem) { this.checkLValInnerPattern(elem, bindingType, checkClashes); }\n }\n break\n\n default:\n this.checkLValSimple(expr, bindingType, checkClashes);\n }\n };\n\n pp$7.checkLValInnerPattern = function(expr, bindingType, checkClashes) {\n if ( bindingType === void 0 ) bindingType = BIND_NONE;\n\n switch (expr.type) {\n case \"Property\":\n // AssignmentProperty has type === \"Property\"\n this.checkLValInnerPattern(expr.value, bindingType, checkClashes);\n break\n\n case \"AssignmentPattern\":\n this.checkLValPattern(expr.left, bindingType, checkClashes);\n break\n\n case \"RestElement\":\n this.checkLValPattern(expr.argument, bindingType, checkClashes);\n break\n\n default:\n this.checkLValPattern(expr, bindingType, checkClashes);\n }\n };\n\n // The algorithm used to determine whether a regexp can appear at a\n // given point in the program is loosely based on sweet.js' approach.\n // See https://github.com/mozilla/sweet.js/wiki/design\n\n\n var TokContext = function TokContext(token, isExpr, preserveSpace, override, generator) {\n this.token = token;\n this.isExpr = !!isExpr;\n this.preserveSpace = !!preserveSpace;\n this.override = override;\n this.generator = !!generator;\n };\n\n var types = {\n b_stat: new TokContext(\"{\", false),\n b_expr: new TokContext(\"{\", true),\n b_tmpl: new TokContext(\"${\", false),\n p_stat: new TokContext(\"(\", false),\n p_expr: new TokContext(\"(\", true),\n q_tmpl: new TokContext(\"`\", true, true, function (p) { return p.tryReadTemplateToken(); }),\n f_stat: new TokContext(\"function\", false),\n f_expr: new TokContext(\"function\", true),\n f_expr_gen: new TokContext(\"function\", true, false, null, true),\n f_gen: new TokContext(\"function\", false, false, null, true)\n };\n\n var pp$6 = Parser.prototype;\n\n pp$6.initialContext = function() {\n return [types.b_stat]\n };\n\n pp$6.curContext = function() {\n return this.context[this.context.length - 1]\n };\n\n pp$6.braceIsBlock = function(prevType) {\n var parent = this.curContext();\n if (parent === types.f_expr || parent === types.f_stat)\n { return true }\n if (prevType === types$1.colon && (parent === types.b_stat || parent === types.b_expr))\n { return !parent.isExpr }\n\n // The check for `tt.name && exprAllowed` detects whether we are\n // after a `yield` or `of` construct. See the `updateContext` for\n // `tt.name`.\n if (prevType === types$1._return || prevType === types$1.name && this.exprAllowed)\n { return lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) }\n if (prevType === types$1._else || prevType === types$1.semi || prevType === types$1.eof || prevType === types$1.parenR || prevType === types$1.arrow)\n { return true }\n if (prevType === types$1.braceL)\n { return parent === types.b_stat }\n if (prevType === types$1._var || prevType === types$1._const || prevType === types$1.name)\n { return false }\n return !this.exprAllowed\n };\n\n pp$6.inGeneratorContext = function() {\n for (var i = this.context.length - 1; i >= 1; i--) {\n var context = this.context[i];\n if (context.token === \"function\")\n { return context.generator }\n }\n return false\n };\n\n pp$6.updateContext = function(prevType) {\n var update, type = this.type;\n if (type.keyword && prevType === types$1.dot)\n { this.exprAllowed = false; }\n else if (update = type.updateContext)\n { update.call(this, prevType); }\n else\n { this.exprAllowed = type.beforeExpr; }\n };\n\n // Used to handle edge cases when token context could not be inferred correctly during tokenization phase\n\n pp$6.overrideContext = function(tokenCtx) {\n if (this.curContext() !== tokenCtx) {\n this.context[this.context.length - 1] = tokenCtx;\n }\n };\n\n // Token-specific context update code\n\n types$1.parenR.updateContext = types$1.braceR.updateContext = function() {\n if (this.context.length === 1) {\n this.exprAllowed = true;\n return\n }\n var out = this.context.pop();\n if (out === types.b_stat && this.curContext().token === \"function\") {\n out = this.context.pop();\n }\n this.exprAllowed = !out.isExpr;\n };\n\n types$1.braceL.updateContext = function(prevType) {\n this.context.push(this.braceIsBlock(prevType) ? types.b_stat : types.b_expr);\n this.exprAllowed = true;\n };\n\n types$1.dollarBraceL.updateContext = function() {\n this.context.push(types.b_tmpl);\n this.exprAllowed = true;\n };\n\n types$1.parenL.updateContext = function(prevType) {\n var statementParens = prevType === types$1._if || prevType === types$1._for || prevType === types$1._with || prevType === types$1._while;\n this.context.push(statementParens ? types.p_stat : types.p_expr);\n this.exprAllowed = true;\n };\n\n types$1.incDec.updateContext = function() {\n // tokExprAllowed stays unchanged\n };\n\n types$1._function.updateContext = types$1._class.updateContext = function(prevType) {\n if (prevType.beforeExpr && prevType !== types$1._else &&\n !(prevType === types$1.semi && this.curContext() !== types.p_stat) &&\n !(prevType === types$1._return && lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) &&\n !((prevType === types$1.colon || prevType === types$1.braceL) && this.curContext() === types.b_stat))\n { this.context.push(types.f_expr); }\n else\n { this.context.push(types.f_stat); }\n this.exprAllowed = false;\n };\n\n types$1.colon.updateContext = function() {\n if (this.curContext().token === \"function\") { this.context.pop(); }\n this.exprAllowed = true;\n };\n\n types$1.backQuote.updateContext = function() {\n if (this.curContext() === types.q_tmpl)\n { this.context.pop(); }\n else\n { this.context.push(types.q_tmpl); }\n this.exprAllowed = false;\n };\n\n types$1.star.updateContext = function(prevType) {\n if (prevType === types$1._function) {\n var index = this.context.length - 1;\n if (this.context[index] === types.f_expr)\n { this.context[index] = types.f_expr_gen; }\n else\n { this.context[index] = types.f_gen; }\n }\n this.exprAllowed = true;\n };\n\n types$1.name.updateContext = function(prevType) {\n var allowed = false;\n if (this.options.ecmaVersion >= 6 && prevType !== types$1.dot) {\n if (this.value === \"of\" && !this.exprAllowed ||\n this.value === \"yield\" && this.inGeneratorContext())\n { allowed = true; }\n }\n this.exprAllowed = allowed;\n };\n\n // A recursive descent parser operates by defining functions for all\n // syntactic elements, and recursively calling those, each function\n // advancing the input stream and returning an AST node. Precedence\n // of constructs (for example, the fact that `!x[1]` means `!(x[1])`\n // instead of `(!x)[1]` is handled by the fact that the parser\n // function that parses unary prefix operators is called first, and\n // in turn calls the function that parses `[]` subscripts — that\n // way, it'll receive the node for `x[1]` already parsed, and wraps\n // *that* in the unary operator node.\n //\n // Acorn uses an [operator precedence parser][opp] to handle binary\n // operator precedence, because it is much more compact than using\n // the technique outlined above, which uses different, nesting\n // functions to specify precedence, for all of the ten binary\n // precedence levels that JavaScript defines.\n //\n // [opp]: http://en.wikipedia.org/wiki/Operator-precedence_parser\n\n\n var pp$5 = Parser.prototype;\n\n // Check if property name clashes with already added.\n // Object/class getters and setters are not allowed to clash —\n // either with each other or with an init property — and in\n // strict mode, init properties are also not allowed to be repeated.\n\n pp$5.checkPropClash = function(prop, propHash, refDestructuringErrors) {\n if (this.options.ecmaVersion >= 9 && prop.type === \"SpreadElement\")\n { return }\n if (this.options.ecmaVersion >= 6 && (prop.computed || prop.method || prop.shorthand))\n { return }\n var key = prop.key;\n var name;\n switch (key.type) {\n case \"Identifier\": name = key.name; break\n case \"Literal\": name = String(key.value); break\n default: return\n }\n var kind = prop.kind;\n if (this.options.ecmaVersion >= 6) {\n if (name === \"__proto__\" && kind === \"init\") {\n if (propHash.proto) {\n if (refDestructuringErrors) {\n if (refDestructuringErrors.doubleProto < 0) {\n refDestructuringErrors.doubleProto = key.start;\n }\n } else {\n this.raiseRecoverable(key.start, \"Redefinition of __proto__ property\");\n }\n }\n propHash.proto = true;\n }\n return\n }\n name = \"$\" + name;\n var other = propHash[name];\n if (other) {\n var redefinition;\n if (kind === \"init\") {\n redefinition = this.strict && other.init || other.get || other.set;\n } else {\n redefinition = other.init || other[kind];\n }\n if (redefinition)\n { this.raiseRecoverable(key.start, \"Redefinition of property\"); }\n } else {\n other = propHash[name] = {\n init: false,\n get: false,\n set: false\n };\n }\n other[kind] = true;\n };\n\n // ### Expression parsing\n\n // These nest, from the most general expression type at the top to\n // 'atomic', nondivisible expression types at the bottom. Most of\n // the functions will simply let the function(s) below them parse,\n // and, *if* the syntactic construct they handle is present, wrap\n // the AST node that the inner parser gave them in another node.\n\n // Parse a full expression. The optional arguments are used to\n // forbid the `in` operator (in for loops initalization expressions)\n // and provide reference for storing '=' operator inside shorthand\n // property assignment in contexts where both object expression\n // and object pattern might appear (so it's possible to raise\n // delayed syntax error at correct position).\n\n pp$5.parseExpression = function(forInit, refDestructuringErrors) {\n var startPos = this.start, startLoc = this.startLoc;\n var expr = this.parseMaybeAssign(forInit, refDestructuringErrors);\n if (this.type === types$1.comma) {\n var node = this.startNodeAt(startPos, startLoc);\n node.expressions = [expr];\n while (this.eat(types$1.comma)) { node.expressions.push(this.parseMaybeAssign(forInit, refDestructuringErrors)); }\n return this.finishNode(node, \"SequenceExpression\")\n }\n return expr\n };\n\n // Parse an assignment expression. This includes applications of\n // operators like `+=`.\n\n pp$5.parseMaybeAssign = function(forInit, refDestructuringErrors, afterLeftParse) {\n if (this.isContextual(\"yield\")) {\n if (this.inGenerator) { return this.parseYield(forInit) }\n // The tokenizer will assume an expression is allowed after\n // `yield`, but this isn't that kind of yield\n else { this.exprAllowed = false; }\n }\n\n var ownDestructuringErrors = false, oldParenAssign = -1, oldTrailingComma = -1, oldDoubleProto = -1;\n if (refDestructuringErrors) {\n oldParenAssign = refDestructuringErrors.parenthesizedAssign;\n oldTrailingComma = refDestructuringErrors.trailingComma;\n oldDoubleProto = refDestructuringErrors.doubleProto;\n refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = -1;\n } else {\n refDestructuringErrors = new DestructuringErrors;\n ownDestructuringErrors = true;\n }\n\n var startPos = this.start, startLoc = this.startLoc;\n if (this.type === types$1.parenL || this.type === types$1.name) {\n this.potentialArrowAt = this.start;\n this.potentialArrowInForAwait = forInit === \"await\";\n }\n var left = this.parseMaybeConditional(forInit, refDestructuringErrors);\n if (afterLeftParse) { left = afterLeftParse.call(this, left, startPos, startLoc); }\n if (this.type.isAssign) {\n var node = this.startNodeAt(startPos, startLoc);\n node.operator = this.value;\n if (this.type === types$1.eq)\n { left = this.toAssignable(left, false, refDestructuringErrors); }\n if (!ownDestructuringErrors) {\n refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = refDestructuringErrors.doubleProto = -1;\n }\n if (refDestructuringErrors.shorthandAssign >= left.start)\n { refDestructuringErrors.shorthandAssign = -1; } // reset because shorthand default was used correctly\n if (this.type === types$1.eq)\n { this.checkLValPattern(left); }\n else\n { this.checkLValSimple(left); }\n node.left = left;\n this.next();\n node.right = this.parseMaybeAssign(forInit);\n if (oldDoubleProto > -1) { refDestructuringErrors.doubleProto = oldDoubleProto; }\n return this.finishNode(node, \"AssignmentExpression\")\n } else {\n if (ownDestructuringErrors) { this.checkExpressionErrors(refDestructuringErrors, true); }\n }\n if (oldParenAssign > -1) { refDestructuringErrors.parenthesizedAssign = oldParenAssign; }\n if (oldTrailingComma > -1) { refDestructuringErrors.trailingComma = oldTrailingComma; }\n return left\n };\n\n // Parse a ternary conditional (`?:`) operator.\n\n pp$5.parseMaybeConditional = function(forInit, refDestructuringErrors) {\n var startPos = this.start, startLoc = this.startLoc;\n var expr = this.parseExprOps(forInit, refDestructuringErrors);\n if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }\n if (this.eat(types$1.question)) {\n var node = this.startNodeAt(startPos, startLoc);\n node.test = expr;\n node.consequent = this.parseMaybeAssign();\n this.expect(types$1.colon);\n node.alternate = this.parseMaybeAssign(forInit);\n return this.finishNode(node, \"ConditionalExpression\")\n }\n return expr\n };\n\n // Start the precedence parser.\n\n pp$5.parseExprOps = function(forInit, refDestructuringErrors) {\n var startPos = this.start, startLoc = this.startLoc;\n var expr = this.parseMaybeUnary(refDestructuringErrors, false, false, forInit);\n if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }\n return expr.start === startPos && expr.type === \"ArrowFunctionExpression\" ? expr : this.parseExprOp(expr, startPos, startLoc, -1, forInit)\n };\n\n // Parse binary operators with the operator precedence parsing\n // algorithm. `left` is the left-hand side of the operator.\n // `minPrec` provides context that allows the function to stop and\n // defer further parser to one of its callers when it encounters an\n // operator that has a lower precedence than the set it is parsing.\n\n pp$5.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, forInit) {\n var prec = this.type.binop;\n if (prec != null && (!forInit || this.type !== types$1._in)) {\n if (prec > minPrec) {\n var logical = this.type === types$1.logicalOR || this.type === types$1.logicalAND;\n var coalesce = this.type === types$1.coalesce;\n if (coalesce) {\n // Handle the precedence of `tt.coalesce` as equal to the range of logical expressions.\n // In other words, `node.right` shouldn't contain logical expressions in order to check the mixed error.\n prec = types$1.logicalAND.binop;\n }\n var op = this.value;\n this.next();\n var startPos = this.start, startLoc = this.startLoc;\n var right = this.parseExprOp(this.parseMaybeUnary(null, false, false, forInit), startPos, startLoc, prec, forInit);\n var node = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical || coalesce);\n if ((logical && this.type === types$1.coalesce) || (coalesce && (this.type === types$1.logicalOR || this.type === types$1.logicalAND))) {\n this.raiseRecoverable(this.start, \"Logical expressions and coalesce expressions cannot be mixed. Wrap either by parentheses\");\n }\n return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, forInit)\n }\n }\n return left\n };\n\n pp$5.buildBinary = function(startPos, startLoc, left, right, op, logical) {\n if (right.type === \"PrivateIdentifier\") { this.raise(right.start, \"Private identifier can only be left side of binary expression\"); }\n var node = this.startNodeAt(startPos, startLoc);\n node.left = left;\n node.operator = op;\n node.right = right;\n return this.finishNode(node, logical ? \"LogicalExpression\" : \"BinaryExpression\")\n };\n\n // Parse unary operators, both prefix and postfix.\n\n pp$5.parseMaybeUnary = function(refDestructuringErrors, sawUnary, incDec, forInit) {\n var startPos = this.start, startLoc = this.startLoc, expr;\n if (this.isContextual(\"await\") && this.canAwait) {\n expr = this.parseAwait(forInit);\n sawUnary = true;\n } else if (this.type.prefix) {\n var node = this.startNode(), update = this.type === types$1.incDec;\n node.operator = this.value;\n node.prefix = true;\n this.next();\n node.argument = this.parseMaybeUnary(null, true, update, forInit);\n this.checkExpressionErrors(refDestructuringErrors, true);\n if (update) { this.checkLValSimple(node.argument); }\n else if (this.strict && node.operator === \"delete\" && isLocalVariableAccess(node.argument))\n { this.raiseRecoverable(node.start, \"Deleting local variable in strict mode\"); }\n else if (node.operator === \"delete\" && isPrivateFieldAccess(node.argument))\n { this.raiseRecoverable(node.start, \"Private fields can not be deleted\"); }\n else { sawUnary = true; }\n expr = this.finishNode(node, update ? \"UpdateExpression\" : \"UnaryExpression\");\n } else if (!sawUnary && this.type === types$1.privateId) {\n if ((forInit || this.privateNameStack.length === 0) && this.options.checkPrivateFields) { this.unexpected(); }\n expr = this.parsePrivateIdent();\n // only could be private fields in 'in', such as #x in obj\n if (this.type !== types$1._in) { this.unexpected(); }\n } else {\n expr = this.parseExprSubscripts(refDestructuringErrors, forInit);\n if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }\n while (this.type.postfix && !this.canInsertSemicolon()) {\n var node$1 = this.startNodeAt(startPos, startLoc);\n node$1.operator = this.value;\n node$1.prefix = false;\n node$1.argument = expr;\n this.checkLValSimple(expr);\n this.next();\n expr = this.finishNode(node$1, \"UpdateExpression\");\n }\n }\n\n if (!incDec && this.eat(types$1.starstar)) {\n if (sawUnary)\n { this.unexpected(this.lastTokStart); }\n else\n { return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false, false, forInit), \"**\", false) }\n } else {\n return expr\n }\n };\n\n function isLocalVariableAccess(node) {\n return (\n node.type === \"Identifier\" ||\n node.type === \"ParenthesizedExpression\" && isLocalVariableAccess(node.expression)\n )\n }\n\n function isPrivateFieldAccess(node) {\n return (\n node.type === \"MemberExpression\" && node.property.type === \"PrivateIdentifier\" ||\n node.type === \"ChainExpression\" && isPrivateFieldAccess(node.expression) ||\n node.type === \"ParenthesizedExpression\" && isPrivateFieldAccess(node.expression)\n )\n }\n\n // Parse call, dot, and `[]`-subscript expressions.\n\n pp$5.parseExprSubscripts = function(refDestructuringErrors, forInit) {\n var startPos = this.start, startLoc = this.startLoc;\n var expr = this.parseExprAtom(refDestructuringErrors, forInit);\n if (expr.type === \"ArrowFunctionExpression\" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== \")\")\n { return expr }\n var result = this.parseSubscripts(expr, startPos, startLoc, false, forInit);\n if (refDestructuringErrors && result.type === \"MemberExpression\") {\n if (refDestructuringErrors.parenthesizedAssign >= result.start) { refDestructuringErrors.parenthesizedAssign = -1; }\n if (refDestructuringErrors.parenthesizedBind >= result.start) { refDestructuringErrors.parenthesizedBind = -1; }\n if (refDestructuringErrors.trailingComma >= result.start) { refDestructuringErrors.trailingComma = -1; }\n }\n return result\n };\n\n pp$5.parseSubscripts = function(base, startPos, startLoc, noCalls, forInit) {\n var maybeAsyncArrow = this.options.ecmaVersion >= 8 && base.type === \"Identifier\" && base.name === \"async\" &&\n this.lastTokEnd === base.end && !this.canInsertSemicolon() && base.end - base.start === 5 &&\n this.potentialArrowAt === base.start;\n var optionalChained = false;\n\n while (true) {\n var element = this.parseSubscript(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit);\n\n if (element.optional) { optionalChained = true; }\n if (element === base || element.type === \"ArrowFunctionExpression\") {\n if (optionalChained) {\n var chainNode = this.startNodeAt(startPos, startLoc);\n chainNode.expression = element;\n element = this.finishNode(chainNode, \"ChainExpression\");\n }\n return element\n }\n\n base = element;\n }\n };\n\n pp$5.shouldParseAsyncArrow = function() {\n return !this.canInsertSemicolon() && this.eat(types$1.arrow)\n };\n\n pp$5.parseSubscriptAsyncArrow = function(startPos, startLoc, exprList, forInit) {\n return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, true, forInit)\n };\n\n pp$5.parseSubscript = function(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit) {\n var optionalSupported = this.options.ecmaVersion >= 11;\n var optional = optionalSupported && this.eat(types$1.questionDot);\n if (noCalls && optional) { this.raise(this.lastTokStart, \"Optional chaining cannot appear in the callee of new expressions\"); }\n\n var computed = this.eat(types$1.bracketL);\n if (computed || (optional && this.type !== types$1.parenL && this.type !== types$1.backQuote) || this.eat(types$1.dot)) {\n var node = this.startNodeAt(startPos, startLoc);\n node.object = base;\n if (computed) {\n node.property = this.parseExpression();\n this.expect(types$1.bracketR);\n } else if (this.type === types$1.privateId && base.type !== \"Super\") {\n node.property = this.parsePrivateIdent();\n } else {\n node.property = this.parseIdent(this.options.allowReserved !== \"never\");\n }\n node.computed = !!computed;\n if (optionalSupported) {\n node.optional = optional;\n }\n base = this.finishNode(node, \"MemberExpression\");\n } else if (!noCalls && this.eat(types$1.parenL)) {\n var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n this.yieldPos = 0;\n this.awaitPos = 0;\n this.awaitIdentPos = 0;\n var exprList = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false, refDestructuringErrors);\n if (maybeAsyncArrow && !optional && this.shouldParseAsyncArrow()) {\n this.checkPatternErrors(refDestructuringErrors, false);\n this.checkYieldAwaitInDefaultParams();\n if (this.awaitIdentPos > 0)\n { this.raise(this.awaitIdentPos, \"Cannot use 'await' as identifier inside an async function\"); }\n this.yieldPos = oldYieldPos;\n this.awaitPos = oldAwaitPos;\n this.awaitIdentPos = oldAwaitIdentPos;\n return this.parseSubscriptAsyncArrow(startPos, startLoc, exprList, forInit)\n }\n this.checkExpressionErrors(refDestructuringErrors, true);\n this.yieldPos = oldYieldPos || this.yieldPos;\n this.awaitPos = oldAwaitPos || this.awaitPos;\n this.awaitIdentPos = oldAwaitIdentPos || this.awaitIdentPos;\n var node$1 = this.startNodeAt(startPos, startLoc);\n node$1.callee = base;\n node$1.arguments = exprList;\n if (optionalSupported) {\n node$1.optional = optional;\n }\n base = this.finishNode(node$1, \"CallExpression\");\n } else if (this.type === types$1.backQuote) {\n if (optional || optionalChained) {\n this.raise(this.start, \"Optional chaining cannot appear in the tag of tagged template expressions\");\n }\n var node$2 = this.startNodeAt(startPos, startLoc);\n node$2.tag = base;\n node$2.quasi = this.parseTemplate({isTagged: true});\n base = this.finishNode(node$2, \"TaggedTemplateExpression\");\n }\n return base\n };\n\n // Parse an atomic expression — either a single token that is an\n // expression, an expression started by a keyword like `function` or\n // `new`, or an expression wrapped in punctuation like `()`, `[]`,\n // or `{}`.\n\n pp$5.parseExprAtom = function(refDestructuringErrors, forInit, forNew) {\n // If a division operator appears in an expression position, the\n // tokenizer got confused, and we force it to read a regexp instead.\n if (this.type === types$1.slash) { this.readRegexp(); }\n\n var node, canBeArrow = this.potentialArrowAt === this.start;\n switch (this.type) {\n case types$1._super:\n if (!this.allowSuper)\n { this.raise(this.start, \"'super' keyword outside a method\"); }\n node = this.startNode();\n this.next();\n if (this.type === types$1.parenL && !this.allowDirectSuper)\n { this.raise(node.start, \"super() call outside constructor of a subclass\"); }\n // The `super` keyword can appear at below:\n // SuperProperty:\n // super [ Expression ]\n // super . IdentifierName\n // SuperCall:\n // super ( Arguments )\n if (this.type !== types$1.dot && this.type !== types$1.bracketL && this.type !== types$1.parenL)\n { this.unexpected(); }\n return this.finishNode(node, \"Super\")\n\n case types$1._this:\n node = this.startNode();\n this.next();\n return this.finishNode(node, \"ThisExpression\")\n\n case types$1.name:\n var startPos = this.start, startLoc = this.startLoc, containsEsc = this.containsEsc;\n var id = this.parseIdent(false);\n if (this.options.ecmaVersion >= 8 && !containsEsc && id.name === \"async\" && !this.canInsertSemicolon() && this.eat(types$1._function)) {\n this.overrideContext(types.f_expr);\n return this.parseFunction(this.startNodeAt(startPos, startLoc), 0, false, true, forInit)\n }\n if (canBeArrow && !this.canInsertSemicolon()) {\n if (this.eat(types$1.arrow))\n { return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], false, forInit) }\n if (this.options.ecmaVersion >= 8 && id.name === \"async\" && this.type === types$1.name && !containsEsc &&\n (!this.potentialArrowInForAwait || this.value !== \"of\" || this.containsEsc)) {\n id = this.parseIdent(false);\n if (this.canInsertSemicolon() || !this.eat(types$1.arrow))\n { this.unexpected(); }\n return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], true, forInit)\n }\n }\n return id\n\n case types$1.regexp:\n var value = this.value;\n node = this.parseLiteral(value.value);\n node.regex = {pattern: value.pattern, flags: value.flags};\n return node\n\n case types$1.num: case types$1.string:\n return this.parseLiteral(this.value)\n\n case types$1._null: case types$1._true: case types$1._false:\n node = this.startNode();\n node.value = this.type === types$1._null ? null : this.type === types$1._true;\n node.raw = this.type.keyword;\n this.next();\n return this.finishNode(node, \"Literal\")\n\n case types$1.parenL:\n var start = this.start, expr = this.parseParenAndDistinguishExpression(canBeArrow, forInit);\n if (refDestructuringErrors) {\n if (refDestructuringErrors.parenthesizedAssign < 0 && !this.isSimpleAssignTarget(expr))\n { refDestructuringErrors.parenthesizedAssign = start; }\n if (refDestructuringErrors.parenthesizedBind < 0)\n { refDestructuringErrors.parenthesizedBind = start; }\n }\n return expr\n\n case types$1.bracketL:\n node = this.startNode();\n this.next();\n node.elements = this.parseExprList(types$1.bracketR, true, true, refDestructuringErrors);\n return this.finishNode(node, \"ArrayExpression\")\n\n case types$1.braceL:\n this.overrideContext(types.b_expr);\n return this.parseObj(false, refDestructuringErrors)\n\n case types$1._function:\n node = this.startNode();\n this.next();\n return this.parseFunction(node, 0)\n\n case types$1._class:\n return this.parseClass(this.startNode(), false)\n\n case types$1._new:\n return this.parseNew()\n\n case types$1.backQuote:\n return this.parseTemplate()\n\n case types$1._import:\n if (this.options.ecmaVersion >= 11) {\n return this.parseExprImport(forNew)\n } else {\n return this.unexpected()\n }\n\n default:\n return this.parseExprAtomDefault()\n }\n };\n\n pp$5.parseExprAtomDefault = function() {\n this.unexpected();\n };\n\n pp$5.parseExprImport = function(forNew) {\n var node = this.startNode();\n\n // Consume `import` as an identifier for `import.meta`.\n // Because `this.parseIdent(true)` doesn't check escape sequences, it needs the check of `this.containsEsc`.\n if (this.containsEsc) { this.raiseRecoverable(this.start, \"Escape sequence in keyword import\"); }\n this.next();\n\n if (this.type === types$1.parenL && !forNew) {\n return this.parseDynamicImport(node)\n } else if (this.type === types$1.dot) {\n var meta = this.startNodeAt(node.start, node.loc && node.loc.start);\n meta.name = \"import\";\n node.meta = this.finishNode(meta, \"Identifier\");\n return this.parseImportMeta(node)\n } else {\n this.unexpected();\n }\n };\n\n pp$5.parseDynamicImport = function(node) {\n this.next(); // skip `(`\n\n // Parse node.source.\n node.source = this.parseMaybeAssign();\n\n if (this.options.ecmaVersion >= 16) {\n if (!this.eat(types$1.parenR)) {\n this.expect(types$1.comma);\n if (!this.afterTrailingComma(types$1.parenR)) {\n node.options = this.parseMaybeAssign();\n if (!this.eat(types$1.parenR)) {\n this.expect(types$1.comma);\n if (!this.afterTrailingComma(types$1.parenR)) {\n this.unexpected();\n }\n }\n } else {\n node.options = null;\n }\n } else {\n node.options = null;\n }\n } else {\n // Verify ending.\n if (!this.eat(types$1.parenR)) {\n var errorPos = this.start;\n if (this.eat(types$1.comma) && this.eat(types$1.parenR)) {\n this.raiseRecoverable(errorPos, \"Trailing comma is not allowed in import()\");\n } else {\n this.unexpected(errorPos);\n }\n }\n }\n\n return this.finishNode(node, \"ImportExpression\")\n };\n\n pp$5.parseImportMeta = function(node) {\n this.next(); // skip `.`\n\n var containsEsc = this.containsEsc;\n node.property = this.parseIdent(true);\n\n if (node.property.name !== \"meta\")\n { this.raiseRecoverable(node.property.start, \"The only valid meta property for import is 'import.meta'\"); }\n if (containsEsc)\n { this.raiseRecoverable(node.start, \"'import.meta' must not contain escaped characters\"); }\n if (this.options.sourceType !== \"module\" && !this.options.allowImportExportEverywhere)\n { this.raiseRecoverable(node.start, \"Cannot use 'import.meta' outside a module\"); }\n\n return this.finishNode(node, \"MetaProperty\")\n };\n\n pp$5.parseLiteral = function(value) {\n var node = this.startNode();\n node.value = value;\n node.raw = this.input.slice(this.start, this.end);\n if (node.raw.charCodeAt(node.raw.length - 1) === 110) { node.bigint = node.raw.slice(0, -1).replace(/_/g, \"\"); }\n this.next();\n return this.finishNode(node, \"Literal\")\n };\n\n pp$5.parseParenExpression = function() {\n this.expect(types$1.parenL);\n var val = this.parseExpression();\n this.expect(types$1.parenR);\n return val\n };\n\n pp$5.shouldParseArrow = function(exprList) {\n return !this.canInsertSemicolon()\n };\n\n pp$5.parseParenAndDistinguishExpression = function(canBeArrow, forInit) {\n var startPos = this.start, startLoc = this.startLoc, val, allowTrailingComma = this.options.ecmaVersion >= 8;\n if (this.options.ecmaVersion >= 6) {\n this.next();\n\n var innerStartPos = this.start, innerStartLoc = this.startLoc;\n var exprList = [], first = true, lastIsComma = false;\n var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, spreadStart;\n this.yieldPos = 0;\n this.awaitPos = 0;\n // Do not save awaitIdentPos to allow checking awaits nested in parameters\n while (this.type !== types$1.parenR) {\n first ? first = false : this.expect(types$1.comma);\n if (allowTrailingComma && this.afterTrailingComma(types$1.parenR, true)) {\n lastIsComma = true;\n break\n } else if (this.type === types$1.ellipsis) {\n spreadStart = this.start;\n exprList.push(this.parseParenItem(this.parseRestBinding()));\n if (this.type === types$1.comma) {\n this.raiseRecoverable(\n this.start,\n \"Comma is not permitted after the rest element\"\n );\n }\n break\n } else {\n exprList.push(this.parseMaybeAssign(false, refDestructuringErrors, this.parseParenItem));\n }\n }\n var innerEndPos = this.lastTokEnd, innerEndLoc = this.lastTokEndLoc;\n this.expect(types$1.parenR);\n\n if (canBeArrow && this.shouldParseArrow(exprList) && this.eat(types$1.arrow)) {\n this.checkPatternErrors(refDestructuringErrors, false);\n this.checkYieldAwaitInDefaultParams();\n this.yieldPos = oldYieldPos;\n this.awaitPos = oldAwaitPos;\n return this.parseParenArrowList(startPos, startLoc, exprList, forInit)\n }\n\n if (!exprList.length || lastIsComma) { this.unexpected(this.lastTokStart); }\n if (spreadStart) { this.unexpected(spreadStart); }\n this.checkExpressionErrors(refDestructuringErrors, true);\n this.yieldPos = oldYieldPos || this.yieldPos;\n this.awaitPos = oldAwaitPos || this.awaitPos;\n\n if (exprList.length > 1) {\n val = this.startNodeAt(innerStartPos, innerStartLoc);\n val.expressions = exprList;\n this.finishNodeAt(val, \"SequenceExpression\", innerEndPos, innerEndLoc);\n } else {\n val = exprList[0];\n }\n } else {\n val = this.parseParenExpression();\n }\n\n if (this.options.preserveParens) {\n var par = this.startNodeAt(startPos, startLoc);\n par.expression = val;\n return this.finishNode(par, \"ParenthesizedExpression\")\n } else {\n return val\n }\n };\n\n pp$5.parseParenItem = function(item) {\n return item\n };\n\n pp$5.parseParenArrowList = function(startPos, startLoc, exprList, forInit) {\n return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, false, forInit)\n };\n\n // New's precedence is slightly tricky. It must allow its argument to\n // be a `[]` or dot subscript expression, but not a call — at least,\n // not without wrapping it in parentheses. Thus, it uses the noCalls\n // argument to parseSubscripts to prevent it from consuming the\n // argument list.\n\n var empty = [];\n\n pp$5.parseNew = function() {\n if (this.containsEsc) { this.raiseRecoverable(this.start, \"Escape sequence in keyword new\"); }\n var node = this.startNode();\n this.next();\n if (this.options.ecmaVersion >= 6 && this.type === types$1.dot) {\n var meta = this.startNodeAt(node.start, node.loc && node.loc.start);\n meta.name = \"new\";\n node.meta = this.finishNode(meta, \"Identifier\");\n this.next();\n var containsEsc = this.containsEsc;\n node.property = this.parseIdent(true);\n if (node.property.name !== \"target\")\n { this.raiseRecoverable(node.property.start, \"The only valid meta property for new is 'new.target'\"); }\n if (containsEsc)\n { this.raiseRecoverable(node.start, \"'new.target' must not contain escaped characters\"); }\n if (!this.allowNewDotTarget)\n { this.raiseRecoverable(node.start, \"'new.target' can only be used in functions and class static block\"); }\n return this.finishNode(node, \"MetaProperty\")\n }\n var startPos = this.start, startLoc = this.startLoc;\n node.callee = this.parseSubscripts(this.parseExprAtom(null, false, true), startPos, startLoc, true, false);\n if (this.eat(types$1.parenL)) { node.arguments = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false); }\n else { node.arguments = empty; }\n return this.finishNode(node, \"NewExpression\")\n };\n\n // Parse template expression.\n\n pp$5.parseTemplateElement = function(ref) {\n var isTagged = ref.isTagged;\n\n var elem = this.startNode();\n if (this.type === types$1.invalidTemplate) {\n if (!isTagged) {\n this.raiseRecoverable(this.start, \"Bad escape sequence in untagged template literal\");\n }\n elem.value = {\n raw: this.value.replace(/\\r\\n?/g, \"\\n\"),\n cooked: null\n };\n } else {\n elem.value = {\n raw: this.input.slice(this.start, this.end).replace(/\\r\\n?/g, \"\\n\"),\n cooked: this.value\n };\n }\n this.next();\n elem.tail = this.type === types$1.backQuote;\n return this.finishNode(elem, \"TemplateElement\")\n };\n\n pp$5.parseTemplate = function(ref) {\n if ( ref === void 0 ) ref = {};\n var isTagged = ref.isTagged; if ( isTagged === void 0 ) isTagged = false;\n\n var node = this.startNode();\n this.next();\n node.expressions = [];\n var curElt = this.parseTemplateElement({isTagged: isTagged});\n node.quasis = [curElt];\n while (!curElt.tail) {\n if (this.type === types$1.eof) { this.raise(this.pos, \"Unterminated template literal\"); }\n this.expect(types$1.dollarBraceL);\n node.expressions.push(this.parseExpression());\n this.expect(types$1.braceR);\n node.quasis.push(curElt = this.parseTemplateElement({isTagged: isTagged}));\n }\n this.next();\n return this.finishNode(node, \"TemplateLiteral\")\n };\n\n pp$5.isAsyncProp = function(prop) {\n return !prop.computed && prop.key.type === \"Identifier\" && prop.key.name === \"async\" &&\n (this.type === types$1.name || this.type === types$1.num || this.type === types$1.string || this.type === types$1.bracketL || this.type.keyword || (this.options.ecmaVersion >= 9 && this.type === types$1.star)) &&\n !lineBreak.test(this.input.slice(this.lastTokEnd, this.start))\n };\n\n // Parse an object literal or binding pattern.\n\n pp$5.parseObj = function(isPattern, refDestructuringErrors) {\n var node = this.startNode(), first = true, propHash = {};\n node.properties = [];\n this.next();\n while (!this.eat(types$1.braceR)) {\n if (!first) {\n this.expect(types$1.comma);\n if (this.options.ecmaVersion >= 5 && this.afterTrailingComma(types$1.braceR)) { break }\n } else { first = false; }\n\n var prop = this.parseProperty(isPattern, refDestructuringErrors);\n if (!isPattern) { this.checkPropClash(prop, propHash, refDestructuringErrors); }\n node.properties.push(prop);\n }\n return this.finishNode(node, isPattern ? \"ObjectPattern\" : \"ObjectExpression\")\n };\n\n pp$5.parseProperty = function(isPattern, refDestructuringErrors) {\n var prop = this.startNode(), isGenerator, isAsync, startPos, startLoc;\n if (this.options.ecmaVersion >= 9 && this.eat(types$1.ellipsis)) {\n if (isPattern) {\n prop.argument = this.parseIdent(false);\n if (this.type === types$1.comma) {\n this.raiseRecoverable(this.start, \"Comma is not permitted after the rest element\");\n }\n return this.finishNode(prop, \"RestElement\")\n }\n // Parse argument.\n prop.argument = this.parseMaybeAssign(false, refDestructuringErrors);\n // To disallow trailing comma via `this.toAssignable()`.\n if (this.type === types$1.comma && refDestructuringErrors && refDestructuringErrors.trailingComma < 0) {\n refDestructuringErrors.trailingComma = this.start;\n }\n // Finish\n return this.finishNode(prop, \"SpreadElement\")\n }\n if (this.options.ecmaVersion >= 6) {\n prop.method = false;\n prop.shorthand = false;\n if (isPattern || refDestructuringErrors) {\n startPos = this.start;\n startLoc = this.startLoc;\n }\n if (!isPattern)\n { isGenerator = this.eat(types$1.star); }\n }\n var containsEsc = this.containsEsc;\n this.parsePropertyName(prop);\n if (!isPattern && !containsEsc && this.options.ecmaVersion >= 8 && !isGenerator && this.isAsyncProp(prop)) {\n isAsync = true;\n isGenerator = this.options.ecmaVersion >= 9 && this.eat(types$1.star);\n this.parsePropertyName(prop);\n } else {\n isAsync = false;\n }\n this.parsePropertyValue(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc);\n return this.finishNode(prop, \"Property\")\n };\n\n pp$5.parseGetterSetter = function(prop) {\n prop.kind = prop.key.name;\n this.parsePropertyName(prop);\n prop.value = this.parseMethod(false);\n var paramCount = prop.kind === \"get\" ? 0 : 1;\n if (prop.value.params.length !== paramCount) {\n var start = prop.value.start;\n if (prop.kind === \"get\")\n { this.raiseRecoverable(start, \"getter should have no params\"); }\n else\n { this.raiseRecoverable(start, \"setter should have exactly one param\"); }\n } else {\n if (prop.kind === \"set\" && prop.value.params[0].type === \"RestElement\")\n { this.raiseRecoverable(prop.value.params[0].start, \"Setter cannot use rest params\"); }\n }\n };\n\n pp$5.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc) {\n if ((isGenerator || isAsync) && this.type === types$1.colon)\n { this.unexpected(); }\n\n if (this.eat(types$1.colon)) {\n prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors);\n prop.kind = \"init\";\n } else if (this.options.ecmaVersion >= 6 && this.type === types$1.parenL) {\n if (isPattern) { this.unexpected(); }\n prop.kind = \"init\";\n prop.method = true;\n prop.value = this.parseMethod(isGenerator, isAsync);\n } else if (!isPattern && !containsEsc &&\n this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === \"Identifier\" &&\n (prop.key.name === \"get\" || prop.key.name === \"set\") &&\n (this.type !== types$1.comma && this.type !== types$1.braceR && this.type !== types$1.eq)) {\n if (isGenerator || isAsync) { this.unexpected(); }\n this.parseGetterSetter(prop);\n } else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === \"Identifier\") {\n if (isGenerator || isAsync) { this.unexpected(); }\n this.checkUnreserved(prop.key);\n if (prop.key.name === \"await\" && !this.awaitIdentPos)\n { this.awaitIdentPos = startPos; }\n prop.kind = \"init\";\n if (isPattern) {\n prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key));\n } else if (this.type === types$1.eq && refDestructuringErrors) {\n if (refDestructuringErrors.shorthandAssign < 0)\n { refDestructuringErrors.shorthandAssign = this.start; }\n prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key));\n } else {\n prop.value = this.copyNode(prop.key);\n }\n prop.shorthand = true;\n } else { this.unexpected(); }\n };\n\n pp$5.parsePropertyName = function(prop) {\n if (this.options.ecmaVersion >= 6) {\n if (this.eat(types$1.bracketL)) {\n prop.computed = true;\n prop.key = this.parseMaybeAssign();\n this.expect(types$1.bracketR);\n return prop.key\n } else {\n prop.computed = false;\n }\n }\n return prop.key = this.type === types$1.num || this.type === types$1.string ? this.parseExprAtom() : this.parseIdent(this.options.allowReserved !== \"never\")\n };\n\n // Initialize empty function node.\n\n pp$5.initFunction = function(node) {\n node.id = null;\n if (this.options.ecmaVersion >= 6) { node.generator = node.expression = false; }\n if (this.options.ecmaVersion >= 8) { node.async = false; }\n };\n\n // Parse object or class method.\n\n pp$5.parseMethod = function(isGenerator, isAsync, allowDirectSuper) {\n var node = this.startNode(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n\n this.initFunction(node);\n if (this.options.ecmaVersion >= 6)\n { node.generator = isGenerator; }\n if (this.options.ecmaVersion >= 8)\n { node.async = !!isAsync; }\n\n this.yieldPos = 0;\n this.awaitPos = 0;\n this.awaitIdentPos = 0;\n this.enterScope(functionFlags(isAsync, node.generator) | SCOPE_SUPER | (allowDirectSuper ? SCOPE_DIRECT_SUPER : 0));\n\n this.expect(types$1.parenL);\n node.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8);\n this.checkYieldAwaitInDefaultParams();\n this.parseFunctionBody(node, false, true, false);\n\n this.yieldPos = oldYieldPos;\n this.awaitPos = oldAwaitPos;\n this.awaitIdentPos = oldAwaitIdentPos;\n return this.finishNode(node, \"FunctionExpression\")\n };\n\n // Parse arrow function expression with given parameters.\n\n pp$5.parseArrowExpression = function(node, params, isAsync, forInit) {\n var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n\n this.enterScope(functionFlags(isAsync, false) | SCOPE_ARROW);\n this.initFunction(node);\n if (this.options.ecmaVersion >= 8) { node.async = !!isAsync; }\n\n this.yieldPos = 0;\n this.awaitPos = 0;\n this.awaitIdentPos = 0;\n\n node.params = this.toAssignableList(params, true);\n this.parseFunctionBody(node, true, false, forInit);\n\n this.yieldPos = oldYieldPos;\n this.awaitPos = oldAwaitPos;\n this.awaitIdentPos = oldAwaitIdentPos;\n return this.finishNode(node, \"ArrowFunctionExpression\")\n };\n\n // Parse function body and check parameters.\n\n pp$5.parseFunctionBody = function(node, isArrowFunction, isMethod, forInit) {\n var isExpression = isArrowFunction && this.type !== types$1.braceL;\n var oldStrict = this.strict, useStrict = false;\n\n if (isExpression) {\n node.body = this.parseMaybeAssign(forInit);\n node.expression = true;\n this.checkParams(node, false);\n } else {\n var nonSimple = this.options.ecmaVersion >= 7 && !this.isSimpleParamList(node.params);\n if (!oldStrict || nonSimple) {\n useStrict = this.strictDirective(this.end);\n // If this is a strict mode function, verify that argument names\n // are not repeated, and it does not try to bind the words `eval`\n // or `arguments`.\n if (useStrict && nonSimple)\n { this.raiseRecoverable(node.start, \"Illegal 'use strict' directive in function with non-simple parameter list\"); }\n }\n // Start a new scope with regard to labels and the `inFunction`\n // flag (restore them to their old value afterwards).\n var oldLabels = this.labels;\n this.labels = [];\n if (useStrict) { this.strict = true; }\n\n // Add the params to varDeclaredNames to ensure that an error is thrown\n // if a let/const declaration in the function clashes with one of the params.\n this.checkParams(node, !oldStrict && !useStrict && !isArrowFunction && !isMethod && this.isSimpleParamList(node.params));\n // Ensure the function name isn't a forbidden identifier in strict mode, e.g. 'eval'\n if (this.strict && node.id) { this.checkLValSimple(node.id, BIND_OUTSIDE); }\n node.body = this.parseBlock(false, undefined, useStrict && !oldStrict);\n node.expression = false;\n this.adaptDirectivePrologue(node.body.body);\n this.labels = oldLabels;\n }\n this.exitScope();\n };\n\n pp$5.isSimpleParamList = function(params) {\n for (var i = 0, list = params; i < list.length; i += 1)\n {\n var param = list[i];\n\n if (param.type !== \"Identifier\") { return false\n } }\n return true\n };\n\n // Checks function params for various disallowed patterns such as using \"eval\"\n // or \"arguments\" and duplicate parameters.\n\n pp$5.checkParams = function(node, allowDuplicates) {\n var nameHash = Object.create(null);\n for (var i = 0, list = node.params; i < list.length; i += 1)\n {\n var param = list[i];\n\n this.checkLValInnerPattern(param, BIND_VAR, allowDuplicates ? null : nameHash);\n }\n };\n\n // Parses a comma-separated list of expressions, and returns them as\n // an array. `close` is the token type that ends the list, and\n // `allowEmpty` can be turned on to allow subsequent commas with\n // nothing in between them to be parsed as `null` (which is needed\n // for array literals).\n\n pp$5.parseExprList = function(close, allowTrailingComma, allowEmpty, refDestructuringErrors) {\n var elts = [], first = true;\n while (!this.eat(close)) {\n if (!first) {\n this.expect(types$1.comma);\n if (allowTrailingComma && this.afterTrailingComma(close)) { break }\n } else { first = false; }\n\n var elt = (void 0);\n if (allowEmpty && this.type === types$1.comma)\n { elt = null; }\n else if (this.type === types$1.ellipsis) {\n elt = this.parseSpread(refDestructuringErrors);\n if (refDestructuringErrors && this.type === types$1.comma && refDestructuringErrors.trailingComma < 0)\n { refDestructuringErrors.trailingComma = this.start; }\n } else {\n elt = this.parseMaybeAssign(false, refDestructuringErrors);\n }\n elts.push(elt);\n }\n return elts\n };\n\n pp$5.checkUnreserved = function(ref) {\n var start = ref.start;\n var end = ref.end;\n var name = ref.name;\n\n if (this.inGenerator && name === \"yield\")\n { this.raiseRecoverable(start, \"Cannot use 'yield' as identifier inside a generator\"); }\n if (this.inAsync && name === \"await\")\n { this.raiseRecoverable(start, \"Cannot use 'await' as identifier inside an async function\"); }\n if (this.currentThisScope().inClassFieldInit && name === \"arguments\")\n { this.raiseRecoverable(start, \"Cannot use 'arguments' in class field initializer\"); }\n if (this.inClassStaticBlock && (name === \"arguments\" || name === \"await\"))\n { this.raise(start, (\"Cannot use \" + name + \" in class static initialization block\")); }\n if (this.keywords.test(name))\n { this.raise(start, (\"Unexpected keyword '\" + name + \"'\")); }\n if (this.options.ecmaVersion < 6 &&\n this.input.slice(start, end).indexOf(\"\\\\\") !== -1) { return }\n var re = this.strict ? this.reservedWordsStrict : this.reservedWords;\n if (re.test(name)) {\n if (!this.inAsync && name === \"await\")\n { this.raiseRecoverable(start, \"Cannot use keyword 'await' outside an async function\"); }\n this.raiseRecoverable(start, (\"The keyword '\" + name + \"' is reserved\"));\n }\n };\n\n // Parse the next token as an identifier. If `liberal` is true (used\n // when parsing properties), it will also convert keywords into\n // identifiers.\n\n pp$5.parseIdent = function(liberal) {\n var node = this.parseIdentNode();\n this.next(!!liberal);\n this.finishNode(node, \"Identifier\");\n if (!liberal) {\n this.checkUnreserved(node);\n if (node.name === \"await\" && !this.awaitIdentPos)\n { this.awaitIdentPos = node.start; }\n }\n return node\n };\n\n pp$5.parseIdentNode = function() {\n var node = this.startNode();\n if (this.type === types$1.name) {\n node.name = this.value;\n } else if (this.type.keyword) {\n node.name = this.type.keyword;\n\n // To fix https://github.com/acornjs/acorn/issues/575\n // `class` and `function` keywords push new context into this.context.\n // But there is no chance to pop the context if the keyword is consumed as an identifier such as a property name.\n // If the previous token is a dot, this does not apply because the context-managing code already ignored the keyword\n if ((node.name === \"class\" || node.name === \"function\") &&\n (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) {\n this.context.pop();\n }\n this.type = types$1.name;\n } else {\n this.unexpected();\n }\n return node\n };\n\n pp$5.parsePrivateIdent = function() {\n var node = this.startNode();\n if (this.type === types$1.privateId) {\n node.name = this.value;\n } else {\n this.unexpected();\n }\n this.next();\n this.finishNode(node, \"PrivateIdentifier\");\n\n // For validating existence\n if (this.options.checkPrivateFields) {\n if (this.privateNameStack.length === 0) {\n this.raise(node.start, (\"Private field '#\" + (node.name) + \"' must be declared in an enclosing class\"));\n } else {\n this.privateNameStack[this.privateNameStack.length - 1].used.push(node);\n }\n }\n\n return node\n };\n\n // Parses yield expression inside generator.\n\n pp$5.parseYield = function(forInit) {\n if (!this.yieldPos) { this.yieldPos = this.start; }\n\n var node = this.startNode();\n this.next();\n if (this.type === types$1.semi || this.canInsertSemicolon() || (this.type !== types$1.star && !this.type.startsExpr)) {\n node.delegate = false;\n node.argument = null;\n } else {\n node.delegate = this.eat(types$1.star);\n node.argument = this.parseMaybeAssign(forInit);\n }\n return this.finishNode(node, \"YieldExpression\")\n };\n\n pp$5.parseAwait = function(forInit) {\n if (!this.awaitPos) { this.awaitPos = this.start; }\n\n var node = this.startNode();\n this.next();\n node.argument = this.parseMaybeUnary(null, true, false, forInit);\n return this.finishNode(node, \"AwaitExpression\")\n };\n\n var pp$4 = Parser.prototype;\n\n // This function is used to raise exceptions on parse errors. It\n // takes an offset integer (into the current `input`) to indicate\n // the location of the error, attaches the position to the end\n // of the error message, and then raises a `SyntaxError` with that\n // message.\n\n pp$4.raise = function(pos, message) {\n var loc = getLineInfo(this.input, pos);\n message += \" (\" + loc.line + \":\" + loc.column + \")\";\n var err = new SyntaxError(message);\n err.pos = pos; err.loc = loc; err.raisedAt = this.pos;\n throw err\n };\n\n pp$4.raiseRecoverable = pp$4.raise;\n\n pp$4.curPosition = function() {\n if (this.options.locations) {\n return new Position(this.curLine, this.pos - this.lineStart)\n }\n };\n\n var pp$3 = Parser.prototype;\n\n var Scope = function Scope(flags) {\n this.flags = flags;\n // A list of var-declared names in the current lexical scope\n this.var = [];\n // A list of lexically-declared names in the current lexical scope\n this.lexical = [];\n // A list of lexically-declared FunctionDeclaration names in the current lexical scope\n this.functions = [];\n // A switch to disallow the identifier reference 'arguments'\n this.inClassFieldInit = false;\n };\n\n // The functions in this module keep track of declared variables in the current scope in order to detect duplicate variable names.\n\n pp$3.enterScope = function(flags) {\n this.scopeStack.push(new Scope(flags));\n };\n\n pp$3.exitScope = function() {\n this.scopeStack.pop();\n };\n\n // The spec says:\n // > At the top level of a function, or script, function declarations are\n // > treated like var declarations rather than like lexical declarations.\n pp$3.treatFunctionsAsVarInScope = function(scope) {\n return (scope.flags & SCOPE_FUNCTION) || !this.inModule && (scope.flags & SCOPE_TOP)\n };\n\n pp$3.declareName = function(name, bindingType, pos) {\n var redeclared = false;\n if (bindingType === BIND_LEXICAL) {\n var scope = this.currentScope();\n redeclared = scope.lexical.indexOf(name) > -1 || scope.functions.indexOf(name) > -1 || scope.var.indexOf(name) > -1;\n scope.lexical.push(name);\n if (this.inModule && (scope.flags & SCOPE_TOP))\n { delete this.undefinedExports[name]; }\n } else if (bindingType === BIND_SIMPLE_CATCH) {\n var scope$1 = this.currentScope();\n scope$1.lexical.push(name);\n } else if (bindingType === BIND_FUNCTION) {\n var scope$2 = this.currentScope();\n if (this.treatFunctionsAsVar)\n { redeclared = scope$2.lexical.indexOf(name) > -1; }\n else\n { redeclared = scope$2.lexical.indexOf(name) > -1 || scope$2.var.indexOf(name) > -1; }\n scope$2.functions.push(name);\n } else {\n for (var i = this.scopeStack.length - 1; i >= 0; --i) {\n var scope$3 = this.scopeStack[i];\n if (scope$3.lexical.indexOf(name) > -1 && !((scope$3.flags & SCOPE_SIMPLE_CATCH) && scope$3.lexical[0] === name) ||\n !this.treatFunctionsAsVarInScope(scope$3) && scope$3.functions.indexOf(name) > -1) {\n redeclared = true;\n break\n }\n scope$3.var.push(name);\n if (this.inModule && (scope$3.flags & SCOPE_TOP))\n { delete this.undefinedExports[name]; }\n if (scope$3.flags & SCOPE_VAR) { break }\n }\n }\n if (redeclared) { this.raiseRecoverable(pos, (\"Identifier '\" + name + \"' has already been declared\")); }\n };\n\n pp$3.checkLocalExport = function(id) {\n // scope.functions must be empty as Module code is always strict.\n if (this.scopeStack[0].lexical.indexOf(id.name) === -1 &&\n this.scopeStack[0].var.indexOf(id.name) === -1) {\n this.undefinedExports[id.name] = id;\n }\n };\n\n pp$3.currentScope = function() {\n return this.scopeStack[this.scopeStack.length - 1]\n };\n\n pp$3.currentVarScope = function() {\n for (var i = this.scopeStack.length - 1;; i--) {\n var scope = this.scopeStack[i];\n if (scope.flags & SCOPE_VAR) { return scope }\n }\n };\n\n // Could be useful for `this`, `new.target`, `super()`, `super.property`, and `super[property]`.\n pp$3.currentThisScope = function() {\n for (var i = this.scopeStack.length - 1;; i--) {\n var scope = this.scopeStack[i];\n if (scope.flags & SCOPE_VAR && !(scope.flags & SCOPE_ARROW)) { return scope }\n }\n };\n\n var Node = function Node(parser, pos, loc) {\n this.type = \"\";\n this.start = pos;\n this.end = 0;\n if (parser.options.locations)\n { this.loc = new SourceLocation(parser, loc); }\n if (parser.options.directSourceFile)\n { this.sourceFile = parser.options.directSourceFile; }\n if (parser.options.ranges)\n { this.range = [pos, 0]; }\n };\n\n // Start an AST node, attaching a start offset.\n\n var pp$2 = Parser.prototype;\n\n pp$2.startNode = function() {\n return new Node(this, this.start, this.startLoc)\n };\n\n pp$2.startNodeAt = function(pos, loc) {\n return new Node(this, pos, loc)\n };\n\n // Finish an AST node, adding `type` and `end` properties.\n\n function finishNodeAt(node, type, pos, loc) {\n node.type = type;\n node.end = pos;\n if (this.options.locations)\n { node.loc.end = loc; }\n if (this.options.ranges)\n { node.range[1] = pos; }\n return node\n }\n\n pp$2.finishNode = function(node, type) {\n return finishNodeAt.call(this, node, type, this.lastTokEnd, this.lastTokEndLoc)\n };\n\n // Finish node at given position\n\n pp$2.finishNodeAt = function(node, type, pos, loc) {\n return finishNodeAt.call(this, node, type, pos, loc)\n };\n\n pp$2.copyNode = function(node) {\n var newNode = new Node(this, node.start, this.startLoc);\n for (var prop in node) { newNode[prop] = node[prop]; }\n return newNode\n };\n\n // This file was generated by \"bin/generate-unicode-script-values.js\". Do not modify manually!\n var scriptValuesAddedInUnicode = \"Gara Garay Gukh Gurung_Khema Hrkt Katakana_Or_Hiragana Kawi Kirat_Rai Krai Nag_Mundari Nagm Ol_Onal Onao Sunu Sunuwar Todhri Todr Tulu_Tigalari Tutg Unknown Zzzz\";\n\n // This file contains Unicode properties extracted from the ECMAScript specification.\n // The lists are extracted like so:\n // $$('#table-binary-unicode-properties > figure > table > tbody > tr > td:nth-child(1) code').map(el => el.innerText)\n\n // #table-binary-unicode-properties\n var ecma9BinaryProperties = \"ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS\";\n var ecma10BinaryProperties = ecma9BinaryProperties + \" Extended_Pictographic\";\n var ecma11BinaryProperties = ecma10BinaryProperties;\n var ecma12BinaryProperties = ecma11BinaryProperties + \" EBase EComp EMod EPres ExtPict\";\n var ecma13BinaryProperties = ecma12BinaryProperties;\n var ecma14BinaryProperties = ecma13BinaryProperties;\n\n var unicodeBinaryProperties = {\n 9: ecma9BinaryProperties,\n 10: ecma10BinaryProperties,\n 11: ecma11BinaryProperties,\n 12: ecma12BinaryProperties,\n 13: ecma13BinaryProperties,\n 14: ecma14BinaryProperties\n };\n\n // #table-binary-unicode-properties-of-strings\n var ecma14BinaryPropertiesOfStrings = \"Basic_Emoji Emoji_Keycap_Sequence RGI_Emoji_Modifier_Sequence RGI_Emoji_Flag_Sequence RGI_Emoji_Tag_Sequence RGI_Emoji_ZWJ_Sequence RGI_Emoji\";\n\n var unicodeBinaryPropertiesOfStrings = {\n 9: \"\",\n 10: \"\",\n 11: \"\",\n 12: \"\",\n 13: \"\",\n 14: ecma14BinaryPropertiesOfStrings\n };\n\n // #table-unicode-general-category-values\n var unicodeGeneralCategoryValues = \"Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu\";\n\n // #table-unicode-script-values\n var ecma9ScriptValues = \"Adlam Adlm Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb\";\n var ecma10ScriptValues = ecma9ScriptValues + \" Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd\";\n var ecma11ScriptValues = ecma10ScriptValues + \" Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho\";\n var ecma12ScriptValues = ecma11ScriptValues + \" Chorasmian Chrs Diak Dives_Akuru Khitan_Small_Script Kits Yezi Yezidi\";\n var ecma13ScriptValues = ecma12ScriptValues + \" Cypro_Minoan Cpmn Old_Uyghur Ougr Tangsa Tnsa Toto Vithkuqi Vith\";\n var ecma14ScriptValues = ecma13ScriptValues + \" \" + scriptValuesAddedInUnicode;\n\n var unicodeScriptValues = {\n 9: ecma9ScriptValues,\n 10: ecma10ScriptValues,\n 11: ecma11ScriptValues,\n 12: ecma12ScriptValues,\n 13: ecma13ScriptValues,\n 14: ecma14ScriptValues\n };\n\n var data = {};\n function buildUnicodeData(ecmaVersion) {\n var d = data[ecmaVersion] = {\n binary: wordsRegexp(unicodeBinaryProperties[ecmaVersion] + \" \" + unicodeGeneralCategoryValues),\n binaryOfStrings: wordsRegexp(unicodeBinaryPropertiesOfStrings[ecmaVersion]),\n nonBinary: {\n General_Category: wordsRegexp(unicodeGeneralCategoryValues),\n Script: wordsRegexp(unicodeScriptValues[ecmaVersion])\n }\n };\n d.nonBinary.Script_Extensions = d.nonBinary.Script;\n\n d.nonBinary.gc = d.nonBinary.General_Category;\n d.nonBinary.sc = d.nonBinary.Script;\n d.nonBinary.scx = d.nonBinary.Script_Extensions;\n }\n\n for (var i = 0, list = [9, 10, 11, 12, 13, 14]; i < list.length; i += 1) {\n var ecmaVersion = list[i];\n\n buildUnicodeData(ecmaVersion);\n }\n\n var pp$1 = Parser.prototype;\n\n // Track disjunction structure to determine whether a duplicate\n // capture group name is allowed because it is in a separate branch.\n var BranchID = function BranchID(parent, base) {\n // Parent disjunction branch\n this.parent = parent;\n // Identifies this set of sibling branches\n this.base = base || this;\n };\n\n BranchID.prototype.separatedFrom = function separatedFrom (alt) {\n // A branch is separate from another branch if they or any of\n // their parents are siblings in a given disjunction\n for (var self = this; self; self = self.parent) {\n for (var other = alt; other; other = other.parent) {\n if (self.base === other.base && self !== other) { return true }\n }\n }\n return false\n };\n\n BranchID.prototype.sibling = function sibling () {\n return new BranchID(this.parent, this.base)\n };\n\n var RegExpValidationState = function RegExpValidationState(parser) {\n this.parser = parser;\n this.validFlags = \"gim\" + (parser.options.ecmaVersion >= 6 ? \"uy\" : \"\") + (parser.options.ecmaVersion >= 9 ? \"s\" : \"\") + (parser.options.ecmaVersion >= 13 ? \"d\" : \"\") + (parser.options.ecmaVersion >= 15 ? \"v\" : \"\");\n this.unicodeProperties = data[parser.options.ecmaVersion >= 14 ? 14 : parser.options.ecmaVersion];\n this.source = \"\";\n this.flags = \"\";\n this.start = 0;\n this.switchU = false;\n this.switchV = false;\n this.switchN = false;\n this.pos = 0;\n this.lastIntValue = 0;\n this.lastStringValue = \"\";\n this.lastAssertionIsQuantifiable = false;\n this.numCapturingParens = 0;\n this.maxBackReference = 0;\n this.groupNames = Object.create(null);\n this.backReferenceNames = [];\n this.branchID = null;\n };\n\n RegExpValidationState.prototype.reset = function reset (start, pattern, flags) {\n var unicodeSets = flags.indexOf(\"v\") !== -1;\n var unicode = flags.indexOf(\"u\") !== -1;\n this.start = start | 0;\n this.source = pattern + \"\";\n this.flags = flags;\n if (unicodeSets && this.parser.options.ecmaVersion >= 15) {\n this.switchU = true;\n this.switchV = true;\n this.switchN = true;\n } else {\n this.switchU = unicode && this.parser.options.ecmaVersion >= 6;\n this.switchV = false;\n this.switchN = unicode && this.parser.options.ecmaVersion >= 9;\n }\n };\n\n RegExpValidationState.prototype.raise = function raise (message) {\n this.parser.raiseRecoverable(this.start, (\"Invalid regular expression: /\" + (this.source) + \"/: \" + message));\n };\n\n // If u flag is given, this returns the code point at the index (it combines a surrogate pair).\n // Otherwise, this returns the code unit of the index (can be a part of a surrogate pair).\n RegExpValidationState.prototype.at = function at (i, forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n var s = this.source;\n var l = s.length;\n if (i >= l) {\n return -1\n }\n var c = s.charCodeAt(i);\n if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l) {\n return c\n }\n var next = s.charCodeAt(i + 1);\n return next >= 0xDC00 && next <= 0xDFFF ? (c << 10) + next - 0x35FDC00 : c\n };\n\n RegExpValidationState.prototype.nextIndex = function nextIndex (i, forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n var s = this.source;\n var l = s.length;\n if (i >= l) {\n return l\n }\n var c = s.charCodeAt(i), next;\n if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l ||\n (next = s.charCodeAt(i + 1)) < 0xDC00 || next > 0xDFFF) {\n return i + 1\n }\n return i + 2\n };\n\n RegExpValidationState.prototype.current = function current (forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n return this.at(this.pos, forceU)\n };\n\n RegExpValidationState.prototype.lookahead = function lookahead (forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n return this.at(this.nextIndex(this.pos, forceU), forceU)\n };\n\n RegExpValidationState.prototype.advance = function advance (forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n this.pos = this.nextIndex(this.pos, forceU);\n };\n\n RegExpValidationState.prototype.eat = function eat (ch, forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n if (this.current(forceU) === ch) {\n this.advance(forceU);\n return true\n }\n return false\n };\n\n RegExpValidationState.prototype.eatChars = function eatChars (chs, forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n var pos = this.pos;\n for (var i = 0, list = chs; i < list.length; i += 1) {\n var ch = list[i];\n\n var current = this.at(pos, forceU);\n if (current === -1 || current !== ch) {\n return false\n }\n pos = this.nextIndex(pos, forceU);\n }\n this.pos = pos;\n return true\n };\n\n /**\n * Validate the flags part of a given RegExpLiteral.\n *\n * @param {RegExpValidationState} state The state to validate RegExp.\n * @returns {void}\n */\n pp$1.validateRegExpFlags = function(state) {\n var validFlags = state.validFlags;\n var flags = state.flags;\n\n var u = false;\n var v = false;\n\n for (var i = 0; i < flags.length; i++) {\n var flag = flags.charAt(i);\n if (validFlags.indexOf(flag) === -1) {\n this.raise(state.start, \"Invalid regular expression flag\");\n }\n if (flags.indexOf(flag, i + 1) > -1) {\n this.raise(state.start, \"Duplicate regular expression flag\");\n }\n if (flag === \"u\") { u = true; }\n if (flag === \"v\") { v = true; }\n }\n if (this.options.ecmaVersion >= 15 && u && v) {\n this.raise(state.start, \"Invalid regular expression flag\");\n }\n };\n\n function hasProp(obj) {\n for (var _ in obj) { return true }\n return false\n }\n\n /**\n * Validate the pattern part of a given RegExpLiteral.\n *\n * @param {RegExpValidationState} state The state to validate RegExp.\n * @returns {void}\n */\n pp$1.validateRegExpPattern = function(state) {\n this.regexp_pattern(state);\n\n // The goal symbol for the parse is |Pattern[~U, ~N]|. If the result of\n // parsing contains a |GroupName|, reparse with the goal symbol\n // |Pattern[~U, +N]| and use this result instead. Throw a *SyntaxError*\n // exception if _P_ did not conform to the grammar, if any elements of _P_\n // were not matched by the parse, or if any Early Error conditions exist.\n if (!state.switchN && this.options.ecmaVersion >= 9 && hasProp(state.groupNames)) {\n state.switchN = true;\n this.regexp_pattern(state);\n }\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-Pattern\n pp$1.regexp_pattern = function(state) {\n state.pos = 0;\n state.lastIntValue = 0;\n state.lastStringValue = \"\";\n state.lastAssertionIsQuantifiable = false;\n state.numCapturingParens = 0;\n state.maxBackReference = 0;\n state.groupNames = Object.create(null);\n state.backReferenceNames.length = 0;\n state.branchID = null;\n\n this.regexp_disjunction(state);\n\n if (state.pos !== state.source.length) {\n // Make the same messages as V8.\n if (state.eat(0x29 /* ) */)) {\n state.raise(\"Unmatched ')'\");\n }\n if (state.eat(0x5D /* ] */) || state.eat(0x7D /* } */)) {\n state.raise(\"Lone quantifier brackets\");\n }\n }\n if (state.maxBackReference > state.numCapturingParens) {\n state.raise(\"Invalid escape\");\n }\n for (var i = 0, list = state.backReferenceNames; i < list.length; i += 1) {\n var name = list[i];\n\n if (!state.groupNames[name]) {\n state.raise(\"Invalid named capture referenced\");\n }\n }\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-Disjunction\n pp$1.regexp_disjunction = function(state) {\n var trackDisjunction = this.options.ecmaVersion >= 16;\n if (trackDisjunction) { state.branchID = new BranchID(state.branchID, null); }\n this.regexp_alternative(state);\n while (state.eat(0x7C /* | */)) {\n if (trackDisjunction) { state.branchID = state.branchID.sibling(); }\n this.regexp_alternative(state);\n }\n if (trackDisjunction) { state.branchID = state.branchID.parent; }\n\n // Make the same message as V8.\n if (this.regexp_eatQuantifier(state, true)) {\n state.raise(\"Nothing to repeat\");\n }\n if (state.eat(0x7B /* { */)) {\n state.raise(\"Lone quantifier brackets\");\n }\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-Alternative\n pp$1.regexp_alternative = function(state) {\n while (state.pos < state.source.length && this.regexp_eatTerm(state)) {}\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Term\n pp$1.regexp_eatTerm = function(state) {\n if (this.regexp_eatAssertion(state)) {\n // Handle `QuantifiableAssertion Quantifier` alternative.\n // `state.lastAssertionIsQuantifiable` is true if the last eaten Assertion\n // is a QuantifiableAssertion.\n if (state.lastAssertionIsQuantifiable && this.regexp_eatQuantifier(state)) {\n // Make the same message as V8.\n if (state.switchU) {\n state.raise(\"Invalid quantifier\");\n }\n }\n return true\n }\n\n if (state.switchU ? this.regexp_eatAtom(state) : this.regexp_eatExtendedAtom(state)) {\n this.regexp_eatQuantifier(state);\n return true\n }\n\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Assertion\n pp$1.regexp_eatAssertion = function(state) {\n var start = state.pos;\n state.lastAssertionIsQuantifiable = false;\n\n // ^, $\n if (state.eat(0x5E /* ^ */) || state.eat(0x24 /* $ */)) {\n return true\n }\n\n // \\b \\B\n if (state.eat(0x5C /* \\ */)) {\n if (state.eat(0x42 /* B */) || state.eat(0x62 /* b */)) {\n return true\n }\n state.pos = start;\n }\n\n // Lookahead / Lookbehind\n if (state.eat(0x28 /* ( */) && state.eat(0x3F /* ? */)) {\n var lookbehind = false;\n if (this.options.ecmaVersion >= 9) {\n lookbehind = state.eat(0x3C /* < */);\n }\n if (state.eat(0x3D /* = */) || state.eat(0x21 /* ! */)) {\n this.regexp_disjunction(state);\n if (!state.eat(0x29 /* ) */)) {\n state.raise(\"Unterminated group\");\n }\n state.lastAssertionIsQuantifiable = !lookbehind;\n return true\n }\n }\n\n state.pos = start;\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-Quantifier\n pp$1.regexp_eatQuantifier = function(state, noError) {\n if ( noError === void 0 ) noError = false;\n\n if (this.regexp_eatQuantifierPrefix(state, noError)) {\n state.eat(0x3F /* ? */);\n return true\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-QuantifierPrefix\n pp$1.regexp_eatQuantifierPrefix = function(state, noError) {\n return (\n state.eat(0x2A /* * */) ||\n state.eat(0x2B /* + */) ||\n state.eat(0x3F /* ? */) ||\n this.regexp_eatBracedQuantifier(state, noError)\n )\n };\n pp$1.regexp_eatBracedQuantifier = function(state, noError) {\n var start = state.pos;\n if (state.eat(0x7B /* { */)) {\n var min = 0, max = -1;\n if (this.regexp_eatDecimalDigits(state)) {\n min = state.lastIntValue;\n if (state.eat(0x2C /* , */) && this.regexp_eatDecimalDigits(state)) {\n max = state.lastIntValue;\n }\n if (state.eat(0x7D /* } */)) {\n // SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-term\n if (max !== -1 && max < min && !noError) {\n state.raise(\"numbers out of order in {} quantifier\");\n }\n return true\n }\n }\n if (state.switchU && !noError) {\n state.raise(\"Incomplete quantifier\");\n }\n state.pos = start;\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-Atom\n pp$1.regexp_eatAtom = function(state) {\n return (\n this.regexp_eatPatternCharacters(state) ||\n state.eat(0x2E /* . */) ||\n this.regexp_eatReverseSolidusAtomEscape(state) ||\n this.regexp_eatCharacterClass(state) ||\n this.regexp_eatUncapturingGroup(state) ||\n this.regexp_eatCapturingGroup(state)\n )\n };\n pp$1.regexp_eatReverseSolidusAtomEscape = function(state) {\n var start = state.pos;\n if (state.eat(0x5C /* \\ */)) {\n if (this.regexp_eatAtomEscape(state)) {\n return true\n }\n state.pos = start;\n }\n return false\n };\n pp$1.regexp_eatUncapturingGroup = function(state) {\n var start = state.pos;\n if (state.eat(0x28 /* ( */)) {\n if (state.eat(0x3F /* ? */)) {\n if (this.options.ecmaVersion >= 16) {\n var addModifiers = this.regexp_eatModifiers(state);\n var hasHyphen = state.eat(0x2D /* - */);\n if (addModifiers || hasHyphen) {\n for (var i = 0; i < addModifiers.length; i++) {\n var modifier = addModifiers.charAt(i);\n if (addModifiers.indexOf(modifier, i + 1) > -1) {\n state.raise(\"Duplicate regular expression modifiers\");\n }\n }\n if (hasHyphen) {\n var removeModifiers = this.regexp_eatModifiers(state);\n if (!addModifiers && !removeModifiers && state.current() === 0x3A /* : */) {\n state.raise(\"Invalid regular expression modifiers\");\n }\n for (var i$1 = 0; i$1 < removeModifiers.length; i$1++) {\n var modifier$1 = removeModifiers.charAt(i$1);\n if (\n removeModifiers.indexOf(modifier$1, i$1 + 1) > -1 ||\n addModifiers.indexOf(modifier$1) > -1\n ) {\n state.raise(\"Duplicate regular expression modifiers\");\n }\n }\n }\n }\n }\n if (state.eat(0x3A /* : */)) {\n this.regexp_disjunction(state);\n if (state.eat(0x29 /* ) */)) {\n return true\n }\n state.raise(\"Unterminated group\");\n }\n }\n state.pos = start;\n }\n return false\n };\n pp$1.regexp_eatCapturingGroup = function(state) {\n if (state.eat(0x28 /* ( */)) {\n if (this.options.ecmaVersion >= 9) {\n this.regexp_groupSpecifier(state);\n } else if (state.current() === 0x3F /* ? */) {\n state.raise(\"Invalid group\");\n }\n this.regexp_disjunction(state);\n if (state.eat(0x29 /* ) */)) {\n state.numCapturingParens += 1;\n return true\n }\n state.raise(\"Unterminated group\");\n }\n return false\n };\n // RegularExpressionModifiers ::\n // [empty]\n // RegularExpressionModifiers RegularExpressionModifier\n pp$1.regexp_eatModifiers = function(state) {\n var modifiers = \"\";\n var ch = 0;\n while ((ch = state.current()) !== -1 && isRegularExpressionModifier(ch)) {\n modifiers += codePointToString(ch);\n state.advance();\n }\n return modifiers\n };\n // RegularExpressionModifier :: one of\n // `i` `m` `s`\n function isRegularExpressionModifier(ch) {\n return ch === 0x69 /* i */ || ch === 0x6d /* m */ || ch === 0x73 /* s */\n }\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedAtom\n pp$1.regexp_eatExtendedAtom = function(state) {\n return (\n state.eat(0x2E /* . */) ||\n this.regexp_eatReverseSolidusAtomEscape(state) ||\n this.regexp_eatCharacterClass(state) ||\n this.regexp_eatUncapturingGroup(state) ||\n this.regexp_eatCapturingGroup(state) ||\n this.regexp_eatInvalidBracedQuantifier(state) ||\n this.regexp_eatExtendedPatternCharacter(state)\n )\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-InvalidBracedQuantifier\n pp$1.regexp_eatInvalidBracedQuantifier = function(state) {\n if (this.regexp_eatBracedQuantifier(state, true)) {\n state.raise(\"Nothing to repeat\");\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-SyntaxCharacter\n pp$1.regexp_eatSyntaxCharacter = function(state) {\n var ch = state.current();\n if (isSyntaxCharacter(ch)) {\n state.lastIntValue = ch;\n state.advance();\n return true\n }\n return false\n };\n function isSyntaxCharacter(ch) {\n return (\n ch === 0x24 /* $ */ ||\n ch >= 0x28 /* ( */ && ch <= 0x2B /* + */ ||\n ch === 0x2E /* . */ ||\n ch === 0x3F /* ? */ ||\n ch >= 0x5B /* [ */ && ch <= 0x5E /* ^ */ ||\n ch >= 0x7B /* { */ && ch <= 0x7D /* } */\n )\n }\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-PatternCharacter\n // But eat eager.\n pp$1.regexp_eatPatternCharacters = function(state) {\n var start = state.pos;\n var ch = 0;\n while ((ch = state.current()) !== -1 && !isSyntaxCharacter(ch)) {\n state.advance();\n }\n return state.pos !== start\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedPatternCharacter\n pp$1.regexp_eatExtendedPatternCharacter = function(state) {\n var ch = state.current();\n if (\n ch !== -1 &&\n ch !== 0x24 /* $ */ &&\n !(ch >= 0x28 /* ( */ && ch <= 0x2B /* + */) &&\n ch !== 0x2E /* . */ &&\n ch !== 0x3F /* ? */ &&\n ch !== 0x5B /* [ */ &&\n ch !== 0x5E /* ^ */ &&\n ch !== 0x7C /* | */\n ) {\n state.advance();\n return true\n }\n return false\n };\n\n // GroupSpecifier ::\n // [empty]\n // `?` GroupName\n pp$1.regexp_groupSpecifier = function(state) {\n if (state.eat(0x3F /* ? */)) {\n if (!this.regexp_eatGroupName(state)) { state.raise(\"Invalid group\"); }\n var trackDisjunction = this.options.ecmaVersion >= 16;\n var known = state.groupNames[state.lastStringValue];\n if (known) {\n if (trackDisjunction) {\n for (var i = 0, list = known; i < list.length; i += 1) {\n var altID = list[i];\n\n if (!altID.separatedFrom(state.branchID))\n { state.raise(\"Duplicate capture group name\"); }\n }\n } else {\n state.raise(\"Duplicate capture group name\");\n }\n }\n if (trackDisjunction) {\n (known || (state.groupNames[state.lastStringValue] = [])).push(state.branchID);\n } else {\n state.groupNames[state.lastStringValue] = true;\n }\n }\n };\n\n // GroupName ::\n // `<` RegExpIdentifierName `>`\n // Note: this updates `state.lastStringValue` property with the eaten name.\n pp$1.regexp_eatGroupName = function(state) {\n state.lastStringValue = \"\";\n if (state.eat(0x3C /* < */)) {\n if (this.regexp_eatRegExpIdentifierName(state) && state.eat(0x3E /* > */)) {\n return true\n }\n state.raise(\"Invalid capture group name\");\n }\n return false\n };\n\n // RegExpIdentifierName ::\n // RegExpIdentifierStart\n // RegExpIdentifierName RegExpIdentifierPart\n // Note: this updates `state.lastStringValue` property with the eaten name.\n pp$1.regexp_eatRegExpIdentifierName = function(state) {\n state.lastStringValue = \"\";\n if (this.regexp_eatRegExpIdentifierStart(state)) {\n state.lastStringValue += codePointToString(state.lastIntValue);\n while (this.regexp_eatRegExpIdentifierPart(state)) {\n state.lastStringValue += codePointToString(state.lastIntValue);\n }\n return true\n }\n return false\n };\n\n // RegExpIdentifierStart ::\n // UnicodeIDStart\n // `$`\n // `_`\n // `\\` RegExpUnicodeEscapeSequence[+U]\n pp$1.regexp_eatRegExpIdentifierStart = function(state) {\n var start = state.pos;\n var forceU = this.options.ecmaVersion >= 11;\n var ch = state.current(forceU);\n state.advance(forceU);\n\n if (ch === 0x5C /* \\ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) {\n ch = state.lastIntValue;\n }\n if (isRegExpIdentifierStart(ch)) {\n state.lastIntValue = ch;\n return true\n }\n\n state.pos = start;\n return false\n };\n function isRegExpIdentifierStart(ch) {\n return isIdentifierStart(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */\n }\n\n // RegExpIdentifierPart ::\n // UnicodeIDContinue\n // `$`\n // `_`\n // `\\` RegExpUnicodeEscapeSequence[+U]\n // <ZWNJ>\n // <ZWJ>\n pp$1.regexp_eatRegExpIdentifierPart = function(state) {\n var start = state.pos;\n var forceU = this.options.ecmaVersion >= 11;\n var ch = state.current(forceU);\n state.advance(forceU);\n\n if (ch === 0x5C /* \\ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) {\n ch = state.lastIntValue;\n }\n if (isRegExpIdentifierPart(ch)) {\n state.lastIntValue = ch;\n return true\n }\n\n state.pos = start;\n return false\n };\n function isRegExpIdentifierPart(ch) {\n return isIdentifierChar(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */ || ch === 0x200C /* <ZWNJ> */ || ch === 0x200D /* <ZWJ> */\n }\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-AtomEscape\n pp$1.regexp_eatAtomEscape = function(state) {\n if (\n this.regexp_eatBackReference(state) ||\n this.regexp_eatCharacterClassEscape(state) ||\n this.regexp_eatCharacterEscape(state) ||\n (state.switchN && this.regexp_eatKGroupName(state))\n ) {\n return true\n }\n if (state.switchU) {\n // Make the same message as V8.\n if (state.current() === 0x63 /* c */) {\n state.raise(\"Invalid unicode escape\");\n }\n state.raise(\"Invalid escape\");\n }\n return false\n };\n pp$1.regexp_eatBackReference = function(state) {\n var start = state.pos;\n if (this.regexp_eatDecimalEscape(state)) {\n var n = state.lastIntValue;\n if (state.switchU) {\n // For SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-atomescape\n if (n > state.maxBackReference) {\n state.maxBackReference = n;\n }\n return true\n }\n if (n <= state.numCapturingParens) {\n return true\n }\n state.pos = start;\n }\n return false\n };\n pp$1.regexp_eatKGroupName = function(state) {\n if (state.eat(0x6B /* k */)) {\n if (this.regexp_eatGroupName(state)) {\n state.backReferenceNames.push(state.lastStringValue);\n return true\n }\n state.raise(\"Invalid named reference\");\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-CharacterEscape\n pp$1.regexp_eatCharacterEscape = function(state) {\n return (\n this.regexp_eatControlEscape(state) ||\n this.regexp_eatCControlLetter(state) ||\n this.regexp_eatZero(state) ||\n this.regexp_eatHexEscapeSequence(state) ||\n this.regexp_eatRegExpUnicodeEscapeSequence(state, false) ||\n (!state.switchU && this.regexp_eatLegacyOctalEscapeSequence(state)) ||\n this.regexp_eatIdentityEscape(state)\n )\n };\n pp$1.regexp_eatCControlLetter = function(state) {\n var start = state.pos;\n if (state.eat(0x63 /* c */)) {\n if (this.regexp_eatControlLetter(state)) {\n return true\n }\n state.pos = start;\n }\n return false\n };\n pp$1.regexp_eatZero = function(state) {\n if (state.current() === 0x30 /* 0 */ && !isDecimalDigit(state.lookahead())) {\n state.lastIntValue = 0;\n state.advance();\n return true\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-ControlEscape\n pp$1.regexp_eatControlEscape = function(state) {\n var ch = state.current();\n if (ch === 0x74 /* t */) {\n state.lastIntValue = 0x09; /* \\t */\n state.advance();\n return true\n }\n if (ch === 0x6E /* n */) {\n state.lastIntValue = 0x0A; /* \\n */\n state.advance();\n return true\n }\n if (ch === 0x76 /* v */) {\n state.lastIntValue = 0x0B; /* \\v */\n state.advance();\n return true\n }\n if (ch === 0x66 /* f */) {\n state.lastIntValue = 0x0C; /* \\f */\n state.advance();\n return true\n }\n if (ch === 0x72 /* r */) {\n state.lastIntValue = 0x0D; /* \\r */\n state.advance();\n return true\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-ControlLetter\n pp$1.regexp_eatControlLetter = function(state) {\n var ch = state.current();\n if (isControlLetter(ch)) {\n state.lastIntValue = ch % 0x20;\n state.advance();\n return true\n }\n return false\n };\n function isControlLetter(ch) {\n return (\n (ch >= 0x41 /* A */ && ch <= 0x5A /* Z */) ||\n (ch >= 0x61 /* a */ && ch <= 0x7A /* z */)\n )\n }\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-RegExpUnicodeEscapeSequence\n pp$1.regexp_eatRegExpUnicodeEscapeSequence = function(state, forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n var start = state.pos;\n var switchU = forceU || state.switchU;\n\n if (state.eat(0x75 /* u */)) {\n if (this.regexp_eatFixedHexDigits(state, 4)) {\n var lead = state.lastIntValue;\n if (switchU && lead >= 0xD800 && lead <= 0xDBFF) {\n var leadSurrogateEnd = state.pos;\n if (state.eat(0x5C /* \\ */) && state.eat(0x75 /* u */) && this.regexp_eatFixedHexDigits(state, 4)) {\n var trail = state.lastIntValue;\n if (trail >= 0xDC00 && trail <= 0xDFFF) {\n state.lastIntValue = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;\n return true\n }\n }\n state.pos = leadSurrogateEnd;\n state.lastIntValue = lead;\n }\n return true\n }\n if (\n switchU &&\n state.eat(0x7B /* { */) &&\n this.regexp_eatHexDigits(state) &&\n state.eat(0x7D /* } */) &&\n isValidUnicode(state.lastIntValue)\n ) {\n return true\n }\n if (switchU) {\n state.raise(\"Invalid unicode escape\");\n }\n state.pos = start;\n }\n\n return false\n };\n function isValidUnicode(ch) {\n return ch >= 0 && ch <= 0x10FFFF\n }\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-IdentityEscape\n pp$1.regexp_eatIdentityEscape = function(state) {\n if (state.switchU) {\n if (this.regexp_eatSyntaxCharacter(state)) {\n return true\n }\n if (state.eat(0x2F /* / */)) {\n state.lastIntValue = 0x2F; /* / */\n return true\n }\n return false\n }\n\n var ch = state.current();\n if (ch !== 0x63 /* c */ && (!state.switchN || ch !== 0x6B /* k */)) {\n state.lastIntValue = ch;\n state.advance();\n return true\n }\n\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalEscape\n pp$1.regexp_eatDecimalEscape = function(state) {\n state.lastIntValue = 0;\n var ch = state.current();\n if (ch >= 0x31 /* 1 */ && ch <= 0x39 /* 9 */) {\n do {\n state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */);\n state.advance();\n } while ((ch = state.current()) >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */)\n return true\n }\n return false\n };\n\n // Return values used by character set parsing methods, needed to\n // forbid negation of sets that can match strings.\n var CharSetNone = 0; // Nothing parsed\n var CharSetOk = 1; // Construct parsed, cannot contain strings\n var CharSetString = 2; // Construct parsed, can contain strings\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClassEscape\n pp$1.regexp_eatCharacterClassEscape = function(state) {\n var ch = state.current();\n\n if (isCharacterClassEscape(ch)) {\n state.lastIntValue = -1;\n state.advance();\n return CharSetOk\n }\n\n var negate = false;\n if (\n state.switchU &&\n this.options.ecmaVersion >= 9 &&\n ((negate = ch === 0x50 /* P */) || ch === 0x70 /* p */)\n ) {\n state.lastIntValue = -1;\n state.advance();\n var result;\n if (\n state.eat(0x7B /* { */) &&\n (result = this.regexp_eatUnicodePropertyValueExpression(state)) &&\n state.eat(0x7D /* } */)\n ) {\n if (negate && result === CharSetString) { state.raise(\"Invalid property name\"); }\n return result\n }\n state.raise(\"Invalid property name\");\n }\n\n return CharSetNone\n };\n\n function isCharacterClassEscape(ch) {\n return (\n ch === 0x64 /* d */ ||\n ch === 0x44 /* D */ ||\n ch === 0x73 /* s */ ||\n ch === 0x53 /* S */ ||\n ch === 0x77 /* w */ ||\n ch === 0x57 /* W */\n )\n }\n\n // UnicodePropertyValueExpression ::\n // UnicodePropertyName `=` UnicodePropertyValue\n // LoneUnicodePropertyNameOrValue\n pp$1.regexp_eatUnicodePropertyValueExpression = function(state) {\n var start = state.pos;\n\n // UnicodePropertyName `=` UnicodePropertyValue\n if (this.regexp_eatUnicodePropertyName(state) && state.eat(0x3D /* = */)) {\n var name = state.lastStringValue;\n if (this.regexp_eatUnicodePropertyValue(state)) {\n var value = state.lastStringValue;\n this.regexp_validateUnicodePropertyNameAndValue(state, name, value);\n return CharSetOk\n }\n }\n state.pos = start;\n\n // LoneUnicodePropertyNameOrValue\n if (this.regexp_eatLoneUnicodePropertyNameOrValue(state)) {\n var nameOrValue = state.lastStringValue;\n return this.regexp_validateUnicodePropertyNameOrValue(state, nameOrValue)\n }\n return CharSetNone\n };\n\n pp$1.regexp_validateUnicodePropertyNameAndValue = function(state, name, value) {\n if (!hasOwn(state.unicodeProperties.nonBinary, name))\n { state.raise(\"Invalid property name\"); }\n if (!state.unicodeProperties.nonBinary[name].test(value))\n { state.raise(\"Invalid property value\"); }\n };\n\n pp$1.regexp_validateUnicodePropertyNameOrValue = function(state, nameOrValue) {\n if (state.unicodeProperties.binary.test(nameOrValue)) { return CharSetOk }\n if (state.switchV && state.unicodeProperties.binaryOfStrings.test(nameOrValue)) { return CharSetString }\n state.raise(\"Invalid property name\");\n };\n\n // UnicodePropertyName ::\n // UnicodePropertyNameCharacters\n pp$1.regexp_eatUnicodePropertyName = function(state) {\n var ch = 0;\n state.lastStringValue = \"\";\n while (isUnicodePropertyNameCharacter(ch = state.current())) {\n state.lastStringValue += codePointToString(ch);\n state.advance();\n }\n return state.lastStringValue !== \"\"\n };\n\n function isUnicodePropertyNameCharacter(ch) {\n return isControlLetter(ch) || ch === 0x5F /* _ */\n }\n\n // UnicodePropertyValue ::\n // UnicodePropertyValueCharacters\n pp$1.regexp_eatUnicodePropertyValue = function(state) {\n var ch = 0;\n state.lastStringValue = \"\";\n while (isUnicodePropertyValueCharacter(ch = state.current())) {\n state.lastStringValue += codePointToString(ch);\n state.advance();\n }\n return state.lastStringValue !== \"\"\n };\n function isUnicodePropertyValueCharacter(ch) {\n return isUnicodePropertyNameCharacter(ch) || isDecimalDigit(ch)\n }\n\n // LoneUnicodePropertyNameOrValue ::\n // UnicodePropertyValueCharacters\n pp$1.regexp_eatLoneUnicodePropertyNameOrValue = function(state) {\n return this.regexp_eatUnicodePropertyValue(state)\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClass\n pp$1.regexp_eatCharacterClass = function(state) {\n if (state.eat(0x5B /* [ */)) {\n var negate = state.eat(0x5E /* ^ */);\n var result = this.regexp_classContents(state);\n if (!state.eat(0x5D /* ] */))\n { state.raise(\"Unterminated character class\"); }\n if (negate && result === CharSetString)\n { state.raise(\"Negated character class may contain strings\"); }\n return true\n }\n return false\n };\n\n // https://tc39.es/ecma262/#prod-ClassContents\n // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassRanges\n pp$1.regexp_classContents = function(state) {\n if (state.current() === 0x5D /* ] */) { return CharSetOk }\n if (state.switchV) { return this.regexp_classSetExpression(state) }\n this.regexp_nonEmptyClassRanges(state);\n return CharSetOk\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRanges\n // https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRangesNoDash\n pp$1.regexp_nonEmptyClassRanges = function(state) {\n while (this.regexp_eatClassAtom(state)) {\n var left = state.lastIntValue;\n if (state.eat(0x2D /* - */) && this.regexp_eatClassAtom(state)) {\n var right = state.lastIntValue;\n if (state.switchU && (left === -1 || right === -1)) {\n state.raise(\"Invalid character class\");\n }\n if (left !== -1 && right !== -1 && left > right) {\n state.raise(\"Range out of order in character class\");\n }\n }\n }\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtom\n // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtomNoDash\n pp$1.regexp_eatClassAtom = function(state) {\n var start = state.pos;\n\n if (state.eat(0x5C /* \\ */)) {\n if (this.regexp_eatClassEscape(state)) {\n return true\n }\n if (state.switchU) {\n // Make the same message as V8.\n var ch$1 = state.current();\n if (ch$1 === 0x63 /* c */ || isOctalDigit(ch$1)) {\n state.raise(\"Invalid class escape\");\n }\n state.raise(\"Invalid escape\");\n }\n state.pos = start;\n }\n\n var ch = state.current();\n if (ch !== 0x5D /* ] */) {\n state.lastIntValue = ch;\n state.advance();\n return true\n }\n\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassEscape\n pp$1.regexp_eatClassEscape = function(state) {\n var start = state.pos;\n\n if (state.eat(0x62 /* b */)) {\n state.lastIntValue = 0x08; /* <BS> */\n return true\n }\n\n if (state.switchU && state.eat(0x2D /* - */)) {\n state.lastIntValue = 0x2D; /* - */\n return true\n }\n\n if (!state.switchU && state.eat(0x63 /* c */)) {\n if (this.regexp_eatClassControlLetter(state)) {\n return true\n }\n state.pos = start;\n }\n\n return (\n this.regexp_eatCharacterClassEscape(state) ||\n this.regexp_eatCharacterEscape(state)\n )\n };\n\n // https://tc39.es/ecma262/#prod-ClassSetExpression\n // https://tc39.es/ecma262/#prod-ClassUnion\n // https://tc39.es/ecma262/#prod-ClassIntersection\n // https://tc39.es/ecma262/#prod-ClassSubtraction\n pp$1.regexp_classSetExpression = function(state) {\n var result = CharSetOk, subResult;\n if (this.regexp_eatClassSetRange(state)) ; else if (subResult = this.regexp_eatClassSetOperand(state)) {\n if (subResult === CharSetString) { result = CharSetString; }\n // https://tc39.es/ecma262/#prod-ClassIntersection\n var start = state.pos;\n while (state.eatChars([0x26, 0x26] /* && */)) {\n if (\n state.current() !== 0x26 /* & */ &&\n (subResult = this.regexp_eatClassSetOperand(state))\n ) {\n if (subResult !== CharSetString) { result = CharSetOk; }\n continue\n }\n state.raise(\"Invalid character in character class\");\n }\n if (start !== state.pos) { return result }\n // https://tc39.es/ecma262/#prod-ClassSubtraction\n while (state.eatChars([0x2D, 0x2D] /* -- */)) {\n if (this.regexp_eatClassSetOperand(state)) { continue }\n state.raise(\"Invalid character in character class\");\n }\n if (start !== state.pos) { return result }\n } else {\n state.raise(\"Invalid character in character class\");\n }\n // https://tc39.es/ecma262/#prod-ClassUnion\n for (;;) {\n if (this.regexp_eatClassSetRange(state)) { continue }\n subResult = this.regexp_eatClassSetOperand(state);\n if (!subResult) { return result }\n if (subResult === CharSetString) { result = CharSetString; }\n }\n };\n\n // https://tc39.es/ecma262/#prod-ClassSetRange\n pp$1.regexp_eatClassSetRange = function(state) {\n var start = state.pos;\n if (this.regexp_eatClassSetCharacter(state)) {\n var left = state.lastIntValue;\n if (state.eat(0x2D /* - */) && this.regexp_eatClassSetCharacter(state)) {\n var right = state.lastIntValue;\n if (left !== -1 && right !== -1 && left > right) {\n state.raise(\"Range out of order in character class\");\n }\n return true\n }\n state.pos = start;\n }\n return false\n };\n\n // https://tc39.es/ecma262/#prod-ClassSetOperand\n pp$1.regexp_eatClassSetOperand = function(state) {\n if (this.regexp_eatClassSetCharacter(state)) { return CharSetOk }\n return this.regexp_eatClassStringDisjunction(state) || this.regexp_eatNestedClass(state)\n };\n\n // https://tc39.es/ecma262/#prod-NestedClass\n pp$1.regexp_eatNestedClass = function(state) {\n var start = state.pos;\n if (state.eat(0x5B /* [ */)) {\n var negate = state.eat(0x5E /* ^ */);\n var result = this.regexp_classContents(state);\n if (state.eat(0x5D /* ] */)) {\n if (negate && result === CharSetString) {\n state.raise(\"Negated character class may contain strings\");\n }\n return result\n }\n state.pos = start;\n }\n if (state.eat(0x5C /* \\ */)) {\n var result$1 = this.regexp_eatCharacterClassEscape(state);\n if (result$1) {\n return result$1\n }\n state.pos = start;\n }\n return null\n };\n\n // https://tc39.es/ecma262/#prod-ClassStringDisjunction\n pp$1.regexp_eatClassStringDisjunction = function(state) {\n var start = state.pos;\n if (state.eatChars([0x5C, 0x71] /* \\q */)) {\n if (state.eat(0x7B /* { */)) {\n var result = this.regexp_classStringDisjunctionContents(state);\n if (state.eat(0x7D /* } */)) {\n return result\n }\n } else {\n // Make the same message as V8.\n state.raise(\"Invalid escape\");\n }\n state.pos = start;\n }\n return null\n };\n\n // https://tc39.es/ecma262/#prod-ClassStringDisjunctionContents\n pp$1.regexp_classStringDisjunctionContents = function(state) {\n var result = this.regexp_classString(state);\n while (state.eat(0x7C /* | */)) {\n if (this.regexp_classString(state) === CharSetString) { result = CharSetString; }\n }\n return result\n };\n\n // https://tc39.es/ecma262/#prod-ClassString\n // https://tc39.es/ecma262/#prod-NonEmptyClassString\n pp$1.regexp_classString = function(state) {\n var count = 0;\n while (this.regexp_eatClassSetCharacter(state)) { count++; }\n return count === 1 ? CharSetOk : CharSetString\n };\n\n // https://tc39.es/ecma262/#prod-ClassSetCharacter\n pp$1.regexp_eatClassSetCharacter = function(state) {\n var start = state.pos;\n if (state.eat(0x5C /* \\ */)) {\n if (\n this.regexp_eatCharacterEscape(state) ||\n this.regexp_eatClassSetReservedPunctuator(state)\n ) {\n return true\n }\n if (state.eat(0x62 /* b */)) {\n state.lastIntValue = 0x08; /* <BS> */\n return true\n }\n state.pos = start;\n return false\n }\n var ch = state.current();\n if (ch < 0 || ch === state.lookahead() && isClassSetReservedDoublePunctuatorCharacter(ch)) { return false }\n if (isClassSetSyntaxCharacter(ch)) { return false }\n state.advance();\n state.lastIntValue = ch;\n return true\n };\n\n // https://tc39.es/ecma262/#prod-ClassSetReservedDoublePunctuator\n function isClassSetReservedDoublePunctuatorCharacter(ch) {\n return (\n ch === 0x21 /* ! */ ||\n ch >= 0x23 /* # */ && ch <= 0x26 /* & */ ||\n ch >= 0x2A /* * */ && ch <= 0x2C /* , */ ||\n ch === 0x2E /* . */ ||\n ch >= 0x3A /* : */ && ch <= 0x40 /* @ */ ||\n ch === 0x5E /* ^ */ ||\n ch === 0x60 /* ` */ ||\n ch === 0x7E /* ~ */\n )\n }\n\n // https://tc39.es/ecma262/#prod-ClassSetSyntaxCharacter\n function isClassSetSyntaxCharacter(ch) {\n return (\n ch === 0x28 /* ( */ ||\n ch === 0x29 /* ) */ ||\n ch === 0x2D /* - */ ||\n ch === 0x2F /* / */ ||\n ch >= 0x5B /* [ */ && ch <= 0x5D /* ] */ ||\n ch >= 0x7B /* { */ && ch <= 0x7D /* } */\n )\n }\n\n // https://tc39.es/ecma262/#prod-ClassSetReservedPunctuator\n pp$1.regexp_eatClassSetReservedPunctuator = function(state) {\n var ch = state.current();\n if (isClassSetReservedPunctuator(ch)) {\n state.lastIntValue = ch;\n state.advance();\n return true\n }\n return false\n };\n\n // https://tc39.es/ecma262/#prod-ClassSetReservedPunctuator\n function isClassSetReservedPunctuator(ch) {\n return (\n ch === 0x21 /* ! */ ||\n ch === 0x23 /* # */ ||\n ch === 0x25 /* % */ ||\n ch === 0x26 /* & */ ||\n ch === 0x2C /* , */ ||\n ch === 0x2D /* - */ ||\n ch >= 0x3A /* : */ && ch <= 0x3E /* > */ ||\n ch === 0x40 /* @ */ ||\n ch === 0x60 /* ` */ ||\n ch === 0x7E /* ~ */\n )\n }\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassControlLetter\n pp$1.regexp_eatClassControlLetter = function(state) {\n var ch = state.current();\n if (isDecimalDigit(ch) || ch === 0x5F /* _ */) {\n state.lastIntValue = ch % 0x20;\n state.advance();\n return true\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence\n pp$1.regexp_eatHexEscapeSequence = function(state) {\n var start = state.pos;\n if (state.eat(0x78 /* x */)) {\n if (this.regexp_eatFixedHexDigits(state, 2)) {\n return true\n }\n if (state.switchU) {\n state.raise(\"Invalid escape\");\n }\n state.pos = start;\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalDigits\n pp$1.regexp_eatDecimalDigits = function(state) {\n var start = state.pos;\n var ch = 0;\n state.lastIntValue = 0;\n while (isDecimalDigit(ch = state.current())) {\n state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */);\n state.advance();\n }\n return state.pos !== start\n };\n function isDecimalDigit(ch) {\n return ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */\n }\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigits\n pp$1.regexp_eatHexDigits = function(state) {\n var start = state.pos;\n var ch = 0;\n state.lastIntValue = 0;\n while (isHexDigit(ch = state.current())) {\n state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch);\n state.advance();\n }\n return state.pos !== start\n };\n function isHexDigit(ch) {\n return (\n (ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) ||\n (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) ||\n (ch >= 0x61 /* a */ && ch <= 0x66 /* f */)\n )\n }\n function hexToInt(ch) {\n if (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) {\n return 10 + (ch - 0x41 /* A */)\n }\n if (ch >= 0x61 /* a */ && ch <= 0x66 /* f */) {\n return 10 + (ch - 0x61 /* a */)\n }\n return ch - 0x30 /* 0 */\n }\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-LegacyOctalEscapeSequence\n // Allows only 0-377(octal) i.e. 0-255(decimal).\n pp$1.regexp_eatLegacyOctalEscapeSequence = function(state) {\n if (this.regexp_eatOctalDigit(state)) {\n var n1 = state.lastIntValue;\n if (this.regexp_eatOctalDigit(state)) {\n var n2 = state.lastIntValue;\n if (n1 <= 3 && this.regexp_eatOctalDigit(state)) {\n state.lastIntValue = n1 * 64 + n2 * 8 + state.lastIntValue;\n } else {\n state.lastIntValue = n1 * 8 + n2;\n }\n } else {\n state.lastIntValue = n1;\n }\n return true\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-OctalDigit\n pp$1.regexp_eatOctalDigit = function(state) {\n var ch = state.current();\n if (isOctalDigit(ch)) {\n state.lastIntValue = ch - 0x30; /* 0 */\n state.advance();\n return true\n }\n state.lastIntValue = 0;\n return false\n };\n function isOctalDigit(ch) {\n return ch >= 0x30 /* 0 */ && ch <= 0x37 /* 7 */\n }\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-Hex4Digits\n // https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigit\n // And HexDigit HexDigit in https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence\n pp$1.regexp_eatFixedHexDigits = function(state, length) {\n var start = state.pos;\n state.lastIntValue = 0;\n for (var i = 0; i < length; ++i) {\n var ch = state.current();\n if (!isHexDigit(ch)) {\n state.pos = start;\n return false\n }\n state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch);\n state.advance();\n }\n return true\n };\n\n // Object type used to represent tokens. Note that normally, tokens\n // simply exist as properties on the parser object. This is only\n // used for the onToken callback and the external tokenizer.\n\n var Token = function Token(p) {\n this.type = p.type;\n this.value = p.value;\n this.start = p.start;\n this.end = p.end;\n if (p.options.locations)\n { this.loc = new SourceLocation(p, p.startLoc, p.endLoc); }\n if (p.options.ranges)\n { this.range = [p.start, p.end]; }\n };\n\n // ## Tokenizer\n\n var pp = Parser.prototype;\n\n // Move to the next token\n\n pp.next = function(ignoreEscapeSequenceInKeyword) {\n if (!ignoreEscapeSequenceInKeyword && this.type.keyword && this.containsEsc)\n { this.raiseRecoverable(this.start, \"Escape sequence in keyword \" + this.type.keyword); }\n if (this.options.onToken)\n { this.options.onToken(new Token(this)); }\n\n this.lastTokEnd = this.end;\n this.lastTokStart = this.start;\n this.lastTokEndLoc = this.endLoc;\n this.lastTokStartLoc = this.startLoc;\n this.nextToken();\n };\n\n pp.getToken = function() {\n this.next();\n return new Token(this)\n };\n\n // If we're in an ES6 environment, make parsers iterable\n if (typeof Symbol !== \"undefined\")\n { pp[Symbol.iterator] = function() {\n var this$1$1 = this;\n\n return {\n next: function () {\n var token = this$1$1.getToken();\n return {\n done: token.type === types$1.eof,\n value: token\n }\n }\n }\n }; }\n\n // Toggle strict mode. Re-reads the next number or string to please\n // pedantic tests (`\"use strict\"; 010;` should fail).\n\n // Read a single token, updating the parser object's token-related\n // properties.\n\n pp.nextToken = function() {\n var curContext = this.curContext();\n if (!curContext || !curContext.preserveSpace) { this.skipSpace(); }\n\n this.start = this.pos;\n if (this.options.locations) { this.startLoc = this.curPosition(); }\n if (this.pos >= this.input.length) { return this.finishToken(types$1.eof) }\n\n if (curContext.override) { return curContext.override(this) }\n else { this.readToken(this.fullCharCodeAtPos()); }\n };\n\n pp.readToken = function(code) {\n // Identifier or keyword. '\\uXXXX' sequences are allowed in\n // identifiers, so '\\' also dispatches to that.\n if (isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92 /* '\\' */)\n { return this.readWord() }\n\n return this.getTokenFromCode(code)\n };\n\n pp.fullCharCodeAtPos = function() {\n var code = this.input.charCodeAt(this.pos);\n if (code <= 0xd7ff || code >= 0xdc00) { return code }\n var next = this.input.charCodeAt(this.pos + 1);\n return next <= 0xdbff || next >= 0xe000 ? code : (code << 10) + next - 0x35fdc00\n };\n\n pp.skipBlockComment = function() {\n var startLoc = this.options.onComment && this.curPosition();\n var start = this.pos, end = this.input.indexOf(\"*/\", this.pos += 2);\n if (end === -1) { this.raise(this.pos - 2, \"Unterminated comment\"); }\n this.pos = end + 2;\n if (this.options.locations) {\n for (var nextBreak = (void 0), pos = start; (nextBreak = nextLineBreak(this.input, pos, this.pos)) > -1;) {\n ++this.curLine;\n pos = this.lineStart = nextBreak;\n }\n }\n if (this.options.onComment)\n { this.options.onComment(true, this.input.slice(start + 2, end), start, this.pos,\n startLoc, this.curPosition()); }\n };\n\n pp.skipLineComment = function(startSkip) {\n var start = this.pos;\n var startLoc = this.options.onComment && this.curPosition();\n var ch = this.input.charCodeAt(this.pos += startSkip);\n while (this.pos < this.input.length && !isNewLine(ch)) {\n ch = this.input.charCodeAt(++this.pos);\n }\n if (this.options.onComment)\n { this.options.onComment(false, this.input.slice(start + startSkip, this.pos), start, this.pos,\n startLoc, this.curPosition()); }\n };\n\n // Called at the start of the parse and after every token. Skips\n // whitespace and comments, and.\n\n pp.skipSpace = function() {\n loop: while (this.pos < this.input.length) {\n var ch = this.input.charCodeAt(this.pos);\n switch (ch) {\n case 32: case 160: // ' '\n ++this.pos;\n break\n case 13:\n if (this.input.charCodeAt(this.pos + 1) === 10) {\n ++this.pos;\n }\n case 10: case 8232: case 8233:\n ++this.pos;\n if (this.options.locations) {\n ++this.curLine;\n this.lineStart = this.pos;\n }\n break\n case 47: // '/'\n switch (this.input.charCodeAt(this.pos + 1)) {\n case 42: // '*'\n this.skipBlockComment();\n break\n case 47:\n this.skipLineComment(2);\n break\n default:\n break loop\n }\n break\n default:\n if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) {\n ++this.pos;\n } else {\n break loop\n }\n }\n }\n };\n\n // Called at the end of every token. Sets `end`, `val`, and\n // maintains `context` and `exprAllowed`, and skips the space after\n // the token, so that the next one's `start` will point at the\n // right position.\n\n pp.finishToken = function(type, val) {\n this.end = this.pos;\n if (this.options.locations) { this.endLoc = this.curPosition(); }\n var prevType = this.type;\n this.type = type;\n this.value = val;\n\n this.updateContext(prevType);\n };\n\n // ### Token reading\n\n // This is the function that is called to fetch the next token. It\n // is somewhat obscure, because it works in character codes rather\n // than characters, and because operator parsing has been inlined\n // into it.\n //\n // All in the name of speed.\n //\n pp.readToken_dot = function() {\n var next = this.input.charCodeAt(this.pos + 1);\n if (next >= 48 && next <= 57) { return this.readNumber(true) }\n var next2 = this.input.charCodeAt(this.pos + 2);\n if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) { // 46 = dot '.'\n this.pos += 3;\n return this.finishToken(types$1.ellipsis)\n } else {\n ++this.pos;\n return this.finishToken(types$1.dot)\n }\n };\n\n pp.readToken_slash = function() { // '/'\n var next = this.input.charCodeAt(this.pos + 1);\n if (this.exprAllowed) { ++this.pos; return this.readRegexp() }\n if (next === 61) { return this.finishOp(types$1.assign, 2) }\n return this.finishOp(types$1.slash, 1)\n };\n\n pp.readToken_mult_modulo_exp = function(code) { // '%*'\n var next = this.input.charCodeAt(this.pos + 1);\n var size = 1;\n var tokentype = code === 42 ? types$1.star : types$1.modulo;\n\n // exponentiation operator ** and **=\n if (this.options.ecmaVersion >= 7 && code === 42 && next === 42) {\n ++size;\n tokentype = types$1.starstar;\n next = this.input.charCodeAt(this.pos + 2);\n }\n\n if (next === 61) { return this.finishOp(types$1.assign, size + 1) }\n return this.finishOp(tokentype, size)\n };\n\n pp.readToken_pipe_amp = function(code) { // '|&'\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === code) {\n if (this.options.ecmaVersion >= 12) {\n var next2 = this.input.charCodeAt(this.pos + 2);\n if (next2 === 61) { return this.finishOp(types$1.assign, 3) }\n }\n return this.finishOp(code === 124 ? types$1.logicalOR : types$1.logicalAND, 2)\n }\n if (next === 61) { return this.finishOp(types$1.assign, 2) }\n return this.finishOp(code === 124 ? types$1.bitwiseOR : types$1.bitwiseAND, 1)\n };\n\n pp.readToken_caret = function() { // '^'\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === 61) { return this.finishOp(types$1.assign, 2) }\n return this.finishOp(types$1.bitwiseXOR, 1)\n };\n\n pp.readToken_plus_min = function(code) { // '+-'\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === code) {\n if (next === 45 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 62 &&\n (this.lastTokEnd === 0 || lineBreak.test(this.input.slice(this.lastTokEnd, this.pos)))) {\n // A `-->` line comment\n this.skipLineComment(3);\n this.skipSpace();\n return this.nextToken()\n }\n return this.finishOp(types$1.incDec, 2)\n }\n if (next === 61) { return this.finishOp(types$1.assign, 2) }\n return this.finishOp(types$1.plusMin, 1)\n };\n\n pp.readToken_lt_gt = function(code) { // '<>'\n var next = this.input.charCodeAt(this.pos + 1);\n var size = 1;\n if (next === code) {\n size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2;\n if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types$1.assign, size + 1) }\n return this.finishOp(types$1.bitShift, size)\n }\n if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 &&\n this.input.charCodeAt(this.pos + 3) === 45) {\n // `<!--`, an XML-style comment that should be interpreted as a line comment\n this.skipLineComment(4);\n this.skipSpace();\n return this.nextToken()\n }\n if (next === 61) { size = 2; }\n return this.finishOp(types$1.relational, size)\n };\n\n pp.readToken_eq_excl = function(code) { // '=!'\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === 61) { return this.finishOp(types$1.equality, this.input.charCodeAt(this.pos + 2) === 61 ? 3 : 2) }\n if (code === 61 && next === 62 && this.options.ecmaVersion >= 6) { // '=>'\n this.pos += 2;\n return this.finishToken(types$1.arrow)\n }\n return this.finishOp(code === 61 ? types$1.eq : types$1.prefix, 1)\n };\n\n pp.readToken_question = function() { // '?'\n var ecmaVersion = this.options.ecmaVersion;\n if (ecmaVersion >= 11) {\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === 46) {\n var next2 = this.input.charCodeAt(this.pos + 2);\n if (next2 < 48 || next2 > 57) { return this.finishOp(types$1.questionDot, 2) }\n }\n if (next === 63) {\n if (ecmaVersion >= 12) {\n var next2$1 = this.input.charCodeAt(this.pos + 2);\n if (next2$1 === 61) { return this.finishOp(types$1.assign, 3) }\n }\n return this.finishOp(types$1.coalesce, 2)\n }\n }\n return this.finishOp(types$1.question, 1)\n };\n\n pp.readToken_numberSign = function() { // '#'\n var ecmaVersion = this.options.ecmaVersion;\n var code = 35; // '#'\n if (ecmaVersion >= 13) {\n ++this.pos;\n code = this.fullCharCodeAtPos();\n if (isIdentifierStart(code, true) || code === 92 /* '\\' */) {\n return this.finishToken(types$1.privateId, this.readWord1())\n }\n }\n\n this.raise(this.pos, \"Unexpected character '\" + codePointToString(code) + \"'\");\n };\n\n pp.getTokenFromCode = function(code) {\n switch (code) {\n // The interpretation of a dot depends on whether it is followed\n // by a digit or another two dots.\n case 46: // '.'\n return this.readToken_dot()\n\n // Punctuation tokens.\n case 40: ++this.pos; return this.finishToken(types$1.parenL)\n case 41: ++this.pos; return this.finishToken(types$1.parenR)\n case 59: ++this.pos; return this.finishToken(types$1.semi)\n case 44: ++this.pos; return this.finishToken(types$1.comma)\n case 91: ++this.pos; return this.finishToken(types$1.bracketL)\n case 93: ++this.pos; return this.finishToken(types$1.bracketR)\n case 123: ++this.pos; return this.finishToken(types$1.braceL)\n case 125: ++this.pos; return this.finishToken(types$1.braceR)\n case 58: ++this.pos; return this.finishToken(types$1.colon)\n\n case 96: // '`'\n if (this.options.ecmaVersion < 6) { break }\n ++this.pos;\n return this.finishToken(types$1.backQuote)\n\n case 48: // '0'\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === 120 || next === 88) { return this.readRadixNumber(16) } // '0x', '0X' - hex number\n if (this.options.ecmaVersion >= 6) {\n if (next === 111 || next === 79) { return this.readRadixNumber(8) } // '0o', '0O' - octal number\n if (next === 98 || next === 66) { return this.readRadixNumber(2) } // '0b', '0B' - binary number\n }\n\n // Anything else beginning with a digit is an integer, octal\n // number, or float.\n case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: // 1-9\n return this.readNumber(false)\n\n // Quotes produce strings.\n case 34: case 39: // '\"', \"'\"\n return this.readString(code)\n\n // Operators are parsed inline in tiny state machines. '=' (61) is\n // often referred to. `finishOp` simply skips the amount of\n // characters it is given as second argument, and returns a token\n // of the type given by its first argument.\n case 47: // '/'\n return this.readToken_slash()\n\n case 37: case 42: // '%*'\n return this.readToken_mult_modulo_exp(code)\n\n case 124: case 38: // '|&'\n return this.readToken_pipe_amp(code)\n\n case 94: // '^'\n return this.readToken_caret()\n\n case 43: case 45: // '+-'\n return this.readToken_plus_min(code)\n\n case 60: case 62: // '<>'\n return this.readToken_lt_gt(code)\n\n case 61: case 33: // '=!'\n return this.readToken_eq_excl(code)\n\n case 63: // '?'\n return this.readToken_question()\n\n case 126: // '~'\n return this.finishOp(types$1.prefix, 1)\n\n case 35: // '#'\n return this.readToken_numberSign()\n }\n\n this.raise(this.pos, \"Unexpected character '\" + codePointToString(code) + \"'\");\n };\n\n pp.finishOp = function(type, size) {\n var str = this.input.slice(this.pos, this.pos + size);\n this.pos += size;\n return this.finishToken(type, str)\n };\n\n pp.readRegexp = function() {\n var escaped, inClass, start = this.pos;\n for (;;) {\n if (this.pos >= this.input.length) { this.raise(start, \"Unterminated regular expression\"); }\n var ch = this.input.charAt(this.pos);\n if (lineBreak.test(ch)) { this.raise(start, \"Unterminated regular expression\"); }\n if (!escaped) {\n if (ch === \"[\") { inClass = true; }\n else if (ch === \"]\" && inClass) { inClass = false; }\n else if (ch === \"/\" && !inClass) { break }\n escaped = ch === \"\\\\\";\n } else { escaped = false; }\n ++this.pos;\n }\n var pattern = this.input.slice(start, this.pos);\n ++this.pos;\n var flagsStart = this.pos;\n var flags = this.readWord1();\n if (this.containsEsc) { this.unexpected(flagsStart); }\n\n // Validate pattern\n var state = this.regexpState || (this.regexpState = new RegExpValidationState(this));\n state.reset(start, pattern, flags);\n this.validateRegExpFlags(state);\n this.validateRegExpPattern(state);\n\n // Create Literal#value property value.\n var value = null;\n try {\n value = new RegExp(pattern, flags);\n } catch (e) {\n // ESTree requires null if it failed to instantiate RegExp object.\n // https://github.com/estree/estree/blob/a27003adf4fd7bfad44de9cef372a2eacd527b1c/es5.md#regexpliteral\n }\n\n return this.finishToken(types$1.regexp, {pattern: pattern, flags: flags, value: value})\n };\n\n // Read an integer in the given radix. Return null if zero digits\n // were read, the integer value otherwise. When `len` is given, this\n // will return `null` unless the integer has exactly `len` digits.\n\n pp.readInt = function(radix, len, maybeLegacyOctalNumericLiteral) {\n // `len` is used for character escape sequences. In that case, disallow separators.\n var allowSeparators = this.options.ecmaVersion >= 12 && len === undefined;\n\n // `maybeLegacyOctalNumericLiteral` is true if it doesn't have prefix (0x,0o,0b)\n // and isn't fraction part nor exponent part. In that case, if the first digit\n // is zero then disallow separators.\n var isLegacyOctalNumericLiteral = maybeLegacyOctalNumericLiteral && this.input.charCodeAt(this.pos) === 48;\n\n var start = this.pos, total = 0, lastCode = 0;\n for (var i = 0, e = len == null ? Infinity : len; i < e; ++i, ++this.pos) {\n var code = this.input.charCodeAt(this.pos), val = (void 0);\n\n if (allowSeparators && code === 95) {\n if (isLegacyOctalNumericLiteral) { this.raiseRecoverable(this.pos, \"Numeric separator is not allowed in legacy octal numeric literals\"); }\n if (lastCode === 95) { this.raiseRecoverable(this.pos, \"Numeric separator must be exactly one underscore\"); }\n if (i === 0) { this.raiseRecoverable(this.pos, \"Numeric separator is not allowed at the first of digits\"); }\n lastCode = code;\n continue\n }\n\n if (code >= 97) { val = code - 97 + 10; } // a\n else if (code >= 65) { val = code - 65 + 10; } // A\n else if (code >= 48 && code <= 57) { val = code - 48; } // 0-9\n else { val = Infinity; }\n if (val >= radix) { break }\n lastCode = code;\n total = total * radix + val;\n }\n\n if (allowSeparators && lastCode === 95) { this.raiseRecoverable(this.pos - 1, \"Numeric separator is not allowed at the last of digits\"); }\n if (this.pos === start || len != null && this.pos - start !== len) { return null }\n\n return total\n };\n\n function stringToNumber(str, isLegacyOctalNumericLiteral) {\n if (isLegacyOctalNumericLiteral) {\n return parseInt(str, 8)\n }\n\n // `parseFloat(value)` stops parsing at the first numeric separator then returns a wrong value.\n return parseFloat(str.replace(/_/g, \"\"))\n }\n\n function stringToBigInt(str) {\n if (typeof BigInt !== \"function\") {\n return null\n }\n\n // `BigInt(value)` throws syntax error if the string contains numeric separators.\n return BigInt(str.replace(/_/g, \"\"))\n }\n\n pp.readRadixNumber = function(radix) {\n var start = this.pos;\n this.pos += 2; // 0x\n var val = this.readInt(radix);\n if (val == null) { this.raise(this.start + 2, \"Expected number in radix \" + radix); }\n if (this.options.ecmaVersion >= 11 && this.input.charCodeAt(this.pos) === 110) {\n val = stringToBigInt(this.input.slice(start, this.pos));\n ++this.pos;\n } else if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, \"Identifier directly after number\"); }\n return this.finishToken(types$1.num, val)\n };\n\n // Read an integer, octal integer, or floating-point number.\n\n pp.readNumber = function(startsWithDot) {\n var start = this.pos;\n if (!startsWithDot && this.readInt(10, undefined, true) === null) { this.raise(start, \"Invalid number\"); }\n var octal = this.pos - start >= 2 && this.input.charCodeAt(start) === 48;\n if (octal && this.strict) { this.raise(start, \"Invalid number\"); }\n var next = this.input.charCodeAt(this.pos);\n if (!octal && !startsWithDot && this.options.ecmaVersion >= 11 && next === 110) {\n var val$1 = stringToBigInt(this.input.slice(start, this.pos));\n ++this.pos;\n if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, \"Identifier directly after number\"); }\n return this.finishToken(types$1.num, val$1)\n }\n if (octal && /[89]/.test(this.input.slice(start, this.pos))) { octal = false; }\n if (next === 46 && !octal) { // '.'\n ++this.pos;\n this.readInt(10);\n next = this.input.charCodeAt(this.pos);\n }\n if ((next === 69 || next === 101) && !octal) { // 'eE'\n next = this.input.charCodeAt(++this.pos);\n if (next === 43 || next === 45) { ++this.pos; } // '+-'\n if (this.readInt(10) === null) { this.raise(start, \"Invalid number\"); }\n }\n if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, \"Identifier directly after number\"); }\n\n var val = stringToNumber(this.input.slice(start, this.pos), octal);\n return this.finishToken(types$1.num, val)\n };\n\n // Read a string value, interpreting backslash-escapes.\n\n pp.readCodePoint = function() {\n var ch = this.input.charCodeAt(this.pos), code;\n\n if (ch === 123) { // '{'\n if (this.options.ecmaVersion < 6) { this.unexpected(); }\n var codePos = ++this.pos;\n code = this.readHexChar(this.input.indexOf(\"}\", this.pos) - this.pos);\n ++this.pos;\n if (code > 0x10FFFF) { this.invalidStringToken(codePos, \"Code point out of bounds\"); }\n } else {\n code = this.readHexChar(4);\n }\n return code\n };\n\n pp.readString = function(quote) {\n var out = \"\", chunkStart = ++this.pos;\n for (;;) {\n if (this.pos >= this.input.length) { this.raise(this.start, \"Unterminated string constant\"); }\n var ch = this.input.charCodeAt(this.pos);\n if (ch === quote) { break }\n if (ch === 92) { // '\\'\n out += this.input.slice(chunkStart, this.pos);\n out += this.readEscapedChar(false);\n chunkStart = this.pos;\n } else if (ch === 0x2028 || ch === 0x2029) {\n if (this.options.ecmaVersion < 10) { this.raise(this.start, \"Unterminated string constant\"); }\n ++this.pos;\n if (this.options.locations) {\n this.curLine++;\n this.lineStart = this.pos;\n }\n } else {\n if (isNewLine(ch)) { this.raise(this.start, \"Unterminated string constant\"); }\n ++this.pos;\n }\n }\n out += this.input.slice(chunkStart, this.pos++);\n return this.finishToken(types$1.string, out)\n };\n\n // Reads template string tokens.\n\n var INVALID_TEMPLATE_ESCAPE_ERROR = {};\n\n pp.tryReadTemplateToken = function() {\n this.inTemplateElement = true;\n try {\n this.readTmplToken();\n } catch (err) {\n if (err === INVALID_TEMPLATE_ESCAPE_ERROR) {\n this.readInvalidTemplateToken();\n } else {\n throw err\n }\n }\n\n this.inTemplateElement = false;\n };\n\n pp.invalidStringToken = function(position, message) {\n if (this.inTemplateElement && this.options.ecmaVersion >= 9) {\n throw INVALID_TEMPLATE_ESCAPE_ERROR\n } else {\n this.raise(position, message);\n }\n };\n\n pp.readTmplToken = function() {\n var out = \"\", chunkStart = this.pos;\n for (;;) {\n if (this.pos >= this.input.length) { this.raise(this.start, \"Unterminated template\"); }\n var ch = this.input.charCodeAt(this.pos);\n if (ch === 96 || ch === 36 && this.input.charCodeAt(this.pos + 1) === 123) { // '`', '${'\n if (this.pos === this.start && (this.type === types$1.template || this.type === types$1.invalidTemplate)) {\n if (ch === 36) {\n this.pos += 2;\n return this.finishToken(types$1.dollarBraceL)\n } else {\n ++this.pos;\n return this.finishToken(types$1.backQuote)\n }\n }\n out += this.input.slice(chunkStart, this.pos);\n return this.finishToken(types$1.template, out)\n }\n if (ch === 92) { // '\\'\n out += this.input.slice(chunkStart, this.pos);\n out += this.readEscapedChar(true);\n chunkStart = this.pos;\n } else if (isNewLine(ch)) {\n out += this.input.slice(chunkStart, this.pos);\n ++this.pos;\n switch (ch) {\n case 13:\n if (this.input.charCodeAt(this.pos) === 10) { ++this.pos; }\n case 10:\n out += \"\\n\";\n break\n default:\n out += String.fromCharCode(ch);\n break\n }\n if (this.options.locations) {\n ++this.curLine;\n this.lineStart = this.pos;\n }\n chunkStart = this.pos;\n } else {\n ++this.pos;\n }\n }\n };\n\n // Reads a template token to search for the end, without validating any escape sequences\n pp.readInvalidTemplateToken = function() {\n for (; this.pos < this.input.length; this.pos++) {\n switch (this.input[this.pos]) {\n case \"\\\\\":\n ++this.pos;\n break\n\n case \"$\":\n if (this.input[this.pos + 1] !== \"{\") { break }\n // fall through\n case \"`\":\n return this.finishToken(types$1.invalidTemplate, this.input.slice(this.start, this.pos))\n\n case \"\\r\":\n if (this.input[this.pos + 1] === \"\\n\") { ++this.pos; }\n // fall through\n case \"\\n\": case \"\\u2028\": case \"\\u2029\":\n ++this.curLine;\n this.lineStart = this.pos + 1;\n break\n }\n }\n this.raise(this.start, \"Unterminated template\");\n };\n\n // Used to read escaped characters\n\n pp.readEscapedChar = function(inTemplate) {\n var ch = this.input.charCodeAt(++this.pos);\n ++this.pos;\n switch (ch) {\n case 110: return \"\\n\" // 'n' -> '\\n'\n case 114: return \"\\r\" // 'r' -> '\\r'\n case 120: return String.fromCharCode(this.readHexChar(2)) // 'x'\n case 117: return codePointToString(this.readCodePoint()) // 'u'\n case 116: return \"\\t\" // 't' -> '\\t'\n case 98: return \"\\b\" // 'b' -> '\\b'\n case 118: return \"\\u000b\" // 'v' -> '\\u000b'\n case 102: return \"\\f\" // 'f' -> '\\f'\n case 13: if (this.input.charCodeAt(this.pos) === 10) { ++this.pos; } // '\\r\\n'\n case 10: // ' \\n'\n if (this.options.locations) { this.lineStart = this.pos; ++this.curLine; }\n return \"\"\n case 56:\n case 57:\n if (this.strict) {\n this.invalidStringToken(\n this.pos - 1,\n \"Invalid escape sequence\"\n );\n }\n if (inTemplate) {\n var codePos = this.pos - 1;\n\n this.invalidStringToken(\n codePos,\n \"Invalid escape sequence in template string\"\n );\n }\n default:\n if (ch >= 48 && ch <= 55) {\n var octalStr = this.input.substr(this.pos - 1, 3).match(/^[0-7]+/)[0];\n var octal = parseInt(octalStr, 8);\n if (octal > 255) {\n octalStr = octalStr.slice(0, -1);\n octal = parseInt(octalStr, 8);\n }\n this.pos += octalStr.length - 1;\n ch = this.input.charCodeAt(this.pos);\n if ((octalStr !== \"0\" || ch === 56 || ch === 57) && (this.strict || inTemplate)) {\n this.invalidStringToken(\n this.pos - 1 - octalStr.length,\n inTemplate\n ? \"Octal literal in template string\"\n : \"Octal literal in strict mode\"\n );\n }\n return String.fromCharCode(octal)\n }\n if (isNewLine(ch)) {\n // Unicode new line characters after \\ get removed from output in both\n // template literals and strings\n if (this.options.locations) { this.lineStart = this.pos; ++this.curLine; }\n return \"\"\n }\n return String.fromCharCode(ch)\n }\n };\n\n // Used to read character escape sequences ('\\x', '\\u', '\\U').\n\n pp.readHexChar = function(len) {\n var codePos = this.pos;\n var n = this.readInt(16, len);\n if (n === null) { this.invalidStringToken(codePos, \"Bad character escape sequence\"); }\n return n\n };\n\n // Read an identifier, and return it as a string. Sets `this.containsEsc`\n // to whether the word contained a '\\u' escape.\n //\n // Incrementally adds only escaped chars, adding other chunks as-is\n // as a micro-optimization.\n\n pp.readWord1 = function() {\n this.containsEsc = false;\n var word = \"\", first = true, chunkStart = this.pos;\n var astral = this.options.ecmaVersion >= 6;\n while (this.pos < this.input.length) {\n var ch = this.fullCharCodeAtPos();\n if (isIdentifierChar(ch, astral)) {\n this.pos += ch <= 0xffff ? 1 : 2;\n } else if (ch === 92) { // \"\\\"\n this.containsEsc = true;\n word += this.input.slice(chunkStart, this.pos);\n var escStart = this.pos;\n if (this.input.charCodeAt(++this.pos) !== 117) // \"u\"\n { this.invalidStringToken(this.pos, \"Expecting Unicode escape sequence \\\\uXXXX\"); }\n ++this.pos;\n var esc = this.readCodePoint();\n if (!(first ? isIdentifierStart : isIdentifierChar)(esc, astral))\n { this.invalidStringToken(escStart, \"Invalid Unicode escape\"); }\n word += codePointToString(esc);\n chunkStart = this.pos;\n } else {\n break\n }\n first = false;\n }\n return word + this.input.slice(chunkStart, this.pos)\n };\n\n // Read an identifier or keyword token. Will check for reserved\n // words when necessary.\n\n pp.readWord = function() {\n var word = this.readWord1();\n var type = types$1.name;\n if (this.keywords.test(word)) {\n type = keywords[word];\n }\n return this.finishToken(type, word)\n };\n\n // Acorn is a tiny, fast JavaScript parser written in JavaScript.\n //\n // Acorn was written by Marijn Haverbeke, Ingvar Stepanyan, and\n // various contributors and released under an MIT license.\n //\n // Git repositories for Acorn are available at\n //\n // http://marijnhaverbeke.nl/git/acorn\n // https://github.com/acornjs/acorn.git\n //\n // Please use the [github bug tracker][ghbt] to report issues.\n //\n // [ghbt]: https://github.com/acornjs/acorn/issues\n //\n // [walk]: util/walk.js\n\n\n var version = \"8.14.0\";\n\n Parser.acorn = {\n Parser: Parser,\n version: version,\n defaultOptions: defaultOptions,\n Position: Position,\n SourceLocation: SourceLocation,\n getLineInfo: getLineInfo,\n Node: Node,\n TokenType: TokenType,\n tokTypes: types$1,\n keywordTypes: keywords,\n TokContext: TokContext,\n tokContexts: types,\n isIdentifierChar: isIdentifierChar,\n isIdentifierStart: isIdentifierStart,\n Token: Token,\n isNewLine: isNewLine,\n lineBreak: lineBreak,\n lineBreakG: lineBreakG,\n nonASCIIwhitespace: nonASCIIwhitespace\n };\n\n // The main exported interface (under `self.acorn` when in the\n // browser) is a `parse` function that takes a code string and returns\n // an abstract syntax tree as specified by the [ESTree spec][estree].\n //\n // [estree]: https://github.com/estree/estree\n\n function parse(input, options) {\n return Parser.parse(input, options)\n }\n\n // This function tries to parse a single expression at a given\n // offset in a string. Useful for parsing mixed-language formats\n // that embed JavaScript expressions.\n\n function parseExpressionAt(input, pos, options) {\n return Parser.parseExpressionAt(input, pos, options)\n }\n\n // Acorn is organized as a tokenizer and a recursive-descent parser.\n // The `tokenizer` export provides an interface to the tokenizer.\n\n function tokenizer(input, options) {\n return Parser.tokenizer(input, options)\n }\n\n exports.Node = Node;\n exports.Parser = Parser;\n exports.Position = Position;\n exports.SourceLocation = SourceLocation;\n exports.TokContext = TokContext;\n exports.Token = Token;\n exports.TokenType = TokenType;\n exports.defaultOptions = defaultOptions;\n exports.getLineInfo = getLineInfo;\n exports.isIdentifierChar = isIdentifierChar;\n exports.isIdentifierStart = isIdentifierStart;\n exports.isNewLine = isNewLine;\n exports.keywordTypes = keywords;\n exports.lineBreak = lineBreak;\n exports.lineBreakG = lineBreakG;\n exports.nonASCIIwhitespace = nonASCIIwhitespace;\n exports.parse = parse;\n exports.parseExpressionAt = parseExpressionAt;\n exports.tokContexts = types;\n exports.tokTypes = types$1;\n exports.tokenizer = tokenizer;\n exports.version = version;\n\n}));\n","/*!\n * Paper.js v0.12.18 - The Swiss Army Knife of Vector Graphics Scripting.\n * http://paperjs.org/\n *\n * Copyright (c) 2011 - 2020, Jürg Lehni & Jonathan Puckey\n * http://juerglehni.com/ & https://puckey.studio/\n *\n * Distributed under the MIT license. See LICENSE file for details.\n *\n * All rights reserved.\n *\n * Date: Wed Jul 17 14:57:24 2024 +0200\n *\n ***\n *\n * Straps.js - Class inheritance library with support for bean-style accessors\n *\n * Copyright (c) 2006 - 2020 Jürg Lehni\n * http://juerglehni.com/\n *\n * Distributed under the MIT license.\n *\n ***\n *\n * Acorn.js\n * https://marijnhaverbeke.nl/acorn/\n *\n * Acorn is a tiny, fast JavaScript parser written in JavaScript,\n * created by Marijn Haverbeke and released under an MIT license.\n *\n */\n\nvar paper = function(self, undefined) {\n\nself = self || require('./node/self.js');\nvar window = self.window,\n\tdocument = self.document;\n\nvar Base = new function() {\n\tvar hidden = /^(statics|enumerable|beans|preserve)$/,\n\t\tarray = [],\n\t\tslice = array.slice,\n\t\tcreate = Object.create,\n\t\tdescribe = Object.getOwnPropertyDescriptor,\n\t\tdefine = Object.defineProperty,\n\n\t\tforEach = array.forEach || function(iter, bind) {\n\t\t\tfor (var i = 0, l = this.length; i < l; i++) {\n\t\t\t\titer.call(bind, this[i], i, this);\n\t\t\t}\n\t\t},\n\n\t\tforIn = function(iter, bind) {\n\t\t\tfor (var i in this) {\n\t\t\t\tif (this.hasOwnProperty(i))\n\t\t\t\t\titer.call(bind, this[i], i, this);\n\t\t\t}\n\t\t},\n\n\t\tset = Object.assign || function(dst) {\n\t\t\tfor (var i = 1, l = arguments.length; i < l; i++) {\n\t\t\t\tvar src = arguments[i];\n\t\t\t\tfor (var key in src) {\n\t\t\t\t\tif (src.hasOwnProperty(key))\n\t\t\t\t\t\tdst[key] = src[key];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn dst;\n\t\t},\n\n\t\teach = function(obj, iter, bind) {\n\t\t\tif (obj) {\n\t\t\t\tvar desc = describe(obj, 'length');\n\t\t\t\t(desc && typeof desc.value === 'number' ? forEach : forIn)\n\t\t\t\t\t.call(obj, iter, bind = bind || obj);\n\t\t\t}\n\t\t\treturn bind;\n\t\t};\n\n\tfunction inject(dest, src, enumerable, beans, preserve) {\n\t\tvar beansNames = {};\n\n\t\tfunction field(name, val) {\n\t\t\tval = val || (val = describe(src, name))\n\t\t\t\t\t&& (val.get ? val : val.value);\n\t\t\tif (typeof val === 'string' && val[0] === '#')\n\t\t\t\tval = dest[val.substring(1)] || val;\n\t\t\tvar isFunc = typeof val === 'function',\n\t\t\t\tres = val,\n\t\t\t\tprev = preserve || isFunc && !val.base\n\t\t\t\t\t\t? (val && val.get ? name in dest : dest[name])\n\t\t\t\t\t\t: null,\n\t\t\t\tbean;\n\t\t\tif (!preserve || !prev) {\n\t\t\t\tif (isFunc && prev)\n\t\t\t\t\tval.base = prev;\n\t\t\t\tif (isFunc && beans !== false\n\t\t\t\t\t\t&& (bean = name.match(/^([gs]et|is)(([A-Z])(.*))$/)))\n\t\t\t\t\tbeansNames[bean[3].toLowerCase() + bean[4]] = bean[2];\n\t\t\t\tif (!res || isFunc || !res.get || typeof res.get !== 'function'\n\t\t\t\t\t\t|| !Base.isPlainObject(res)) {\n\t\t\t\t\tres = { value: res, writable: true };\n\t\t\t\t}\n\t\t\t\tif ((describe(dest, name)\n\t\t\t\t\t\t|| { configurable: true }).configurable) {\n\t\t\t\t\tres.configurable = true;\n\t\t\t\t\tres.enumerable = enumerable != null ? enumerable : !bean;\n\t\t\t\t}\n\t\t\t\tdefine(dest, name, res);\n\t\t\t}\n\t\t}\n\t\tif (src) {\n\t\t\tfor (var name in src) {\n\t\t\t\tif (src.hasOwnProperty(name) && !hidden.test(name))\n\t\t\t\t\tfield(name);\n\t\t\t}\n\t\t\tfor (var name in beansNames) {\n\t\t\t\tvar part = beansNames[name],\n\t\t\t\t\tset = dest['set' + part],\n\t\t\t\t\tget = dest['get' + part] || set && dest['is' + part];\n\t\t\t\tif (get && (beans === true || get.length === 0))\n\t\t\t\t\tfield(name, { get: get, set: set });\n\t\t\t}\n\t\t}\n\t\treturn dest;\n\t}\n\n\tfunction Base() {\n\t\tfor (var i = 0, l = arguments.length; i < l; i++) {\n\t\t\tvar src = arguments[i];\n\t\t\tif (src)\n\t\t\t\tset(this, src);\n\t\t}\n\t\treturn this;\n\t}\n\n\treturn inject(Base, {\n\t\tinject: function(src) {\n\t\t\tif (src) {\n\t\t\t\tvar statics = src.statics === true ? src : src.statics,\n\t\t\t\t\tbeans = src.beans,\n\t\t\t\t\tpreserve = src.preserve;\n\t\t\t\tif (statics !== src)\n\t\t\t\t\tinject(this.prototype, src, src.enumerable, beans, preserve);\n\t\t\t\tinject(this, statics, null, beans, preserve);\n\t\t\t}\n\t\t\tfor (var i = 1, l = arguments.length; i < l; i++)\n\t\t\t\tthis.inject(arguments[i]);\n\t\t\treturn this;\n\t\t},\n\n\t\textend: function() {\n\t\t\tvar base = this,\n\t\t\t\tctor,\n\t\t\t\tproto;\n\t\t\tfor (var i = 0, obj, l = arguments.length;\n\t\t\t\t\ti < l && !(ctor && proto); i++) {\n\t\t\t\tobj = arguments[i];\n\t\t\t\tctor = ctor || obj.initialize;\n\t\t\t\tproto = proto || obj.prototype;\n\t\t\t}\n\t\t\tctor = ctor || function() {\n\t\t\t\tbase.apply(this, arguments);\n\t\t\t};\n\t\t\tproto = ctor.prototype = proto || create(this.prototype);\n\t\t\tdefine(proto, 'constructor',\n\t\t\t\t\t{ value: ctor, writable: true, configurable: true });\n\t\t\tinject(ctor, this);\n\t\t\tif (arguments.length)\n\t\t\t\tthis.inject.apply(ctor, arguments);\n\t\t\tctor.base = base;\n\t\t\treturn ctor;\n\t\t}\n\t}).inject({\n\t\tenumerable: false,\n\n\t\tinitialize: Base,\n\n\t\tset: Base,\n\n\t\tinject: function() {\n\t\t\tfor (var i = 0, l = arguments.length; i < l; i++) {\n\t\t\t\tvar src = arguments[i];\n\t\t\t\tif (src) {\n\t\t\t\t\tinject(this, src, src.enumerable, src.beans, src.preserve);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t},\n\n\t\textend: function() {\n\t\t\tvar res = create(this);\n\t\t\treturn res.inject.apply(res, arguments);\n\t\t},\n\n\t\teach: function(iter, bind) {\n\t\t\treturn each(this, iter, bind);\n\t\t},\n\n\t\tclone: function() {\n\t\t\treturn new this.constructor(this);\n\t\t},\n\n\t\tstatics: {\n\t\t\tset: set,\n\t\t\teach: each,\n\t\t\tcreate: create,\n\t\t\tdefine: define,\n\t\t\tdescribe: describe,\n\n\t\t\tclone: function(obj) {\n\t\t\t\treturn set(new obj.constructor(), obj);\n\t\t\t},\n\n\t\t\tisPlainObject: function(obj) {\n\t\t\t\tvar ctor = obj != null && obj.constructor;\n\t\t\t\treturn ctor && (ctor === Object || ctor === Base\n\t\t\t\t\t\t|| ctor.name === 'Object');\n\t\t\t},\n\n\t\t\tpick: function(a, b) {\n\t\t\t\treturn a !== undefined ? a : b;\n\t\t\t},\n\n\t\t\tslice: function(list, begin, end) {\n\t\t\t\treturn slice.call(list, begin, end);\n\t\t\t}\n\t\t}\n\t});\n};\n\nif (typeof module !== 'undefined')\n\tmodule.exports = Base;\n\nBase.inject({\n\tenumerable: false,\n\n\ttoString: function() {\n\t\treturn this._id != null\n\t\t\t? (this._class || 'Object') + (this._name\n\t\t\t\t? \" '\" + this._name + \"'\"\n\t\t\t\t: ' @' + this._id)\n\t\t\t: '{ ' + Base.each(this, function(value, key) {\n\t\t\t\tif (!/^_/.test(key)) {\n\t\t\t\t\tvar type = typeof value;\n\t\t\t\t\tthis.push(key + ': ' + (type === 'number'\n\t\t\t\t\t\t\t? Formatter.instance.number(value)\n\t\t\t\t\t\t\t: type === 'string' ? \"'\" + value + \"'\" : value));\n\t\t\t\t}\n\t\t\t}, []).join(', ') + ' }';\n\t},\n\n\tgetClassName: function() {\n\t\treturn this._class || '';\n\t},\n\n\timportJSON: function(json) {\n\t\treturn Base.importJSON(json, this);\n\t},\n\n\texportJSON: function(options) {\n\t\treturn Base.exportJSON(this, options);\n\t},\n\n\ttoJSON: function() {\n\t\treturn Base.serialize(this);\n\t},\n\n\tset: function(props, exclude) {\n\t\tif (props)\n\t\t\tBase.filter(this, props, exclude, this._prioritize);\n\t\treturn this;\n\t}\n}, {\n\nbeans: false,\nstatics: {\n\texports: {},\n\n\textend: function extend() {\n\t\tvar res = extend.base.apply(this, arguments),\n\t\t\tname = res.prototype._class;\n\t\tif (name && !Base.exports[name])\n\t\t\tBase.exports[name] = res;\n\t\treturn res;\n\t},\n\n\tequals: function(obj1, obj2) {\n\t\tif (obj1 === obj2)\n\t\t\treturn true;\n\t\tif (obj1 && obj1.equals)\n\t\t\treturn obj1.equals(obj2);\n\t\tif (obj2 && obj2.equals)\n\t\t\treturn obj2.equals(obj1);\n\t\tif (obj1 && obj2\n\t\t\t\t&& typeof obj1 === 'object' && typeof obj2 === 'object') {\n\t\t\tif (Array.isArray(obj1) && Array.isArray(obj2)) {\n\t\t\t\tvar length = obj1.length;\n\t\t\t\tif (length !== obj2.length)\n\t\t\t\t\treturn false;\n\t\t\t\twhile (length--) {\n\t\t\t\t\tif (!Base.equals(obj1[length], obj2[length]))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar keys = Object.keys(obj1),\n\t\t\t\t\tlength = keys.length;\n\t\t\t\tif (length !== Object.keys(obj2).length)\n\t\t\t\t\treturn false;\n\t\t\t\twhile (length--) {\n\t\t\t\t\tvar key = keys[length];\n\t\t\t\t\tif (!(obj2.hasOwnProperty(key)\n\t\t\t\t\t\t\t&& Base.equals(obj1[key], obj2[key])))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},\n\n\tread: function(list, start, options, amount) {\n\t\tif (this === Base) {\n\t\t\tvar value = this.peek(list, start);\n\t\t\tlist.__index++;\n\t\t\treturn value;\n\t\t}\n\t\tvar proto = this.prototype,\n\t\t\treadIndex = proto._readIndex,\n\t\t\tbegin = start || readIndex && list.__index || 0,\n\t\t\tlength = list.length,\n\t\t\tobj = list[begin];\n\t\tamount = amount || length - begin;\n\t\tif (obj instanceof this\n\t\t\t|| options && options.readNull && obj == null && amount <= 1) {\n\t\t\tif (readIndex)\n\t\t\t\tlist.__index = begin + 1;\n\t\t\treturn obj && options && options.clone ? obj.clone() : obj;\n\t\t}\n\t\tobj = Base.create(proto);\n\t\tif (readIndex)\n\t\t\tobj.__read = true;\n\t\tobj = obj.initialize.apply(obj, begin > 0 || begin + amount < length\n\t\t\t\t? Base.slice(list, begin, begin + amount)\n\t\t\t\t: list) || obj;\n\t\tif (readIndex) {\n\t\t\tlist.__index = begin + obj.__read;\n\t\t\tvar filtered = obj.__filtered;\n\t\t\tif (filtered) {\n\t\t\t\tlist.__filtered = filtered;\n\t\t\t\tobj.__filtered = undefined;\n\t\t\t}\n\t\t\tobj.__read = undefined;\n\t\t}\n\t\treturn obj;\n\t},\n\n\tpeek: function(list, start) {\n\t\treturn list[list.__index = start || list.__index || 0];\n\t},\n\n\tremain: function(list) {\n\t\treturn list.length - (list.__index || 0);\n\t},\n\n\treadList: function(list, start, options, amount) {\n\t\tvar res = [],\n\t\t\tentry,\n\t\t\tbegin = start || 0,\n\t\t\tend = amount ? begin + amount : list.length;\n\t\tfor (var i = begin; i < end; i++) {\n\t\t\tres.push(Array.isArray(entry = list[i])\n\t\t\t\t\t? this.read(entry, 0, options)\n\t\t\t\t\t: this.read(list, i, options, 1));\n\t\t}\n\t\treturn res;\n\t},\n\n\treadNamed: function(list, name, start, options, amount) {\n\t\tvar value = this.getNamed(list, name),\n\t\t\thasValue = value !== undefined;\n\t\tif (hasValue) {\n\t\t\tvar filtered = list.__filtered;\n\t\t\tif (!filtered) {\n\t\t\t\tvar source = this.getSource(list);\n\t\t\t\tfiltered = list.__filtered = Base.create(source);\n\t\t\t\tfiltered.__unfiltered = source;\n\t\t\t}\n\t\t\tfiltered[name] = undefined;\n\t\t}\n\t\treturn this.read(hasValue ? [value] : list, start, options, amount);\n\t},\n\n\treadSupported: function(list, dest) {\n\t\tvar source = this.getSource(list),\n\t\t\tthat = this,\n\t\t\tread = false;\n\t\tif (source) {\n\t\t\tObject.keys(source).forEach(function(key) {\n\t\t\t\tif (key in dest) {\n\t\t\t\t\tvar value = that.readNamed(list, key);\n\t\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t\tdest[key] = value;\n\t\t\t\t\t}\n\t\t\t\t\tread = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn read;\n\t},\n\n\tgetSource: function(list) {\n\t\tvar source = list.__source;\n\t\tif (source === undefined) {\n\t\t\tvar arg = list.length === 1 && list[0];\n\t\t\tsource = list.__source = arg && Base.isPlainObject(arg)\n\t\t\t\t? arg : null;\n\t\t}\n\t\treturn source;\n\t},\n\n\tgetNamed: function(list, name) {\n\t\tvar source = this.getSource(list);\n\t\tif (source) {\n\t\t\treturn name ? source[name] : list.__filtered || source;\n\t\t}\n\t},\n\n\thasNamed: function(list, name) {\n\t\treturn !!this.getNamed(list, name);\n\t},\n\n\tfilter: function(dest, source, exclude, prioritize) {\n\t\tvar processed;\n\n\t\tfunction handleKey(key) {\n\t\t\tif (!(exclude && key in exclude) &&\n\t\t\t\t!(processed && key in processed)) {\n\t\t\t\tvar value = source[key];\n\t\t\t\tif (value !== undefined)\n\t\t\t\t\tdest[key] = value;\n\t\t\t}\n\t\t}\n\n\t\tif (prioritize) {\n\t\t\tvar keys = {};\n\t\t\tfor (var i = 0, key, l = prioritize.length; i < l; i++) {\n\t\t\t\tif ((key = prioritize[i]) in source) {\n\t\t\t\t\thandleKey(key);\n\t\t\t\t\tkeys[key] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tprocessed = keys;\n\t\t}\n\n\t\tObject.keys(source.__unfiltered || source).forEach(handleKey);\n\t\treturn dest;\n\t},\n\n\tisPlainValue: function(obj, asString) {\n\t\treturn Base.isPlainObject(obj) || Array.isArray(obj)\n\t\t\t\t|| asString && typeof obj === 'string';\n\t},\n\n\tserialize: function(obj, options, compact, dictionary) {\n\t\toptions = options || {};\n\n\t\tvar isRoot = !dictionary,\n\t\t\tres;\n\t\tif (isRoot) {\n\t\t\toptions.formatter = new Formatter(options.precision);\n\t\t\tdictionary = {\n\t\t\t\tlength: 0,\n\t\t\t\tdefinitions: {},\n\t\t\t\treferences: {},\n\t\t\t\tadd: function(item, create) {\n\t\t\t\t\tvar id = '#' + item._id,\n\t\t\t\t\t\tref = this.references[id];\n\t\t\t\t\tif (!ref) {\n\t\t\t\t\t\tthis.length++;\n\t\t\t\t\t\tvar res = create.call(item),\n\t\t\t\t\t\t\tname = item._class;\n\t\t\t\t\t\tif (name && res[0] !== name)\n\t\t\t\t\t\t\tres.unshift(name);\n\t\t\t\t\t\tthis.definitions[id] = res;\n\t\t\t\t\t\tref = this.references[id] = [id];\n\t\t\t\t\t}\n\t\t\t\t\treturn ref;\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tif (obj && obj._serialize) {\n\t\t\tres = obj._serialize(options, dictionary);\n\t\t\tvar name = obj._class;\n\t\t\tif (name && !obj._compactSerialize && (isRoot || !compact)\n\t\t\t\t\t&& res[0] !== name) {\n\t\t\t\tres.unshift(name);\n\t\t\t}\n\t\t} else if (Array.isArray(obj)) {\n\t\t\tres = [];\n\t\t\tfor (var i = 0, l = obj.length; i < l; i++)\n\t\t\t\tres[i] = Base.serialize(obj[i], options, compact, dictionary);\n\t\t} else if (Base.isPlainObject(obj)) {\n\t\t\tres = {};\n\t\t\tvar keys = Object.keys(obj);\n\t\t\tfor (var i = 0, l = keys.length; i < l; i++) {\n\t\t\t\tvar key = keys[i];\n\t\t\t\tres[key] = Base.serialize(obj[key], options, compact,\n\t\t\t\t\t\tdictionary);\n\t\t\t}\n\t\t} else if (typeof obj === 'number') {\n\t\t\tres = options.formatter.number(obj, options.precision);\n\t\t} else {\n\t\t\tres = obj;\n\t\t}\n\t\treturn isRoot && dictionary.length > 0\n\t\t\t\t? [['dictionary', dictionary.definitions], res]\n\t\t\t\t: res;\n\t},\n\n\tdeserialize: function(json, create, _data, _setDictionary, _isRoot) {\n\t\tvar res = json,\n\t\t\tisFirst = !_data,\n\t\t\thasDictionary = isFirst && json && json.length\n\t\t\t\t&& json[0][0] === 'dictionary';\n\t\t_data = _data || {};\n\t\tif (Array.isArray(json)) {\n\t\t\tvar type = json[0],\n\t\t\t\tisDictionary = type === 'dictionary';\n\t\t\tif (json.length == 1 && /^#/.test(type)) {\n\t\t\t\treturn _data.dictionary[type];\n\t\t\t}\n\t\t\ttype = Base.exports[type];\n\t\t\tres = [];\n\t\t\tfor (var i = type ? 1 : 0, l = json.length; i < l; i++) {\n\t\t\t\tres.push(Base.deserialize(json[i], create, _data,\n\t\t\t\t\t\tisDictionary, hasDictionary));\n\t\t\t}\n\t\t\tif (type) {\n\t\t\t\tvar args = res;\n\t\t\t\tif (create) {\n\t\t\t\t\tres = create(type, args, isFirst || _isRoot);\n\t\t\t\t} else {\n\t\t\t\t\tres = new type(args);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (Base.isPlainObject(json)) {\n\t\t\tres = {};\n\t\t\tif (_setDictionary)\n\t\t\t\t_data.dictionary = res;\n\t\t\tfor (var key in json)\n\t\t\t\tres[key] = Base.deserialize(json[key], create, _data);\n\t\t}\n\t\treturn hasDictionary ? res[1] : res;\n\t},\n\n\texportJSON: function(obj, options) {\n\t\tvar json = Base.serialize(obj, options);\n\t\treturn options && options.asString == false\n\t\t\t\t? json\n\t\t\t\t: JSON.stringify(json);\n\t},\n\n\timportJSON: function(json, target) {\n\t\treturn Base.deserialize(\n\t\t\t\ttypeof json === 'string' ? JSON.parse(json) : json,\n\t\t\t\tfunction(ctor, args, isRoot) {\n\t\t\t\t\tvar useTarget = isRoot && target\n\t\t\t\t\t\t\t&& target.constructor === ctor,\n\t\t\t\t\t\tobj = useTarget ? target\n\t\t\t\t\t\t\t: Base.create(ctor.prototype);\n\t\t\t\t\tif (args.length === 1 && obj instanceof Item\n\t\t\t\t\t\t\t&& (useTarget || !(obj instanceof Layer))) {\n\t\t\t\t\t\tvar arg = args[0];\n\t\t\t\t\t\tif (Base.isPlainObject(arg)) {\n\t\t\t\t\t\t\targ.insert = false;\n\t\t\t\t\t\t\tif (useTarget) {\n\t\t\t\t\t\t\t\targs = args.concat([Item.INSERT]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t(useTarget ? obj.set : ctor).apply(obj, args);\n\t\t\t\t\tif (useTarget)\n\t\t\t\t\t\ttarget = null;\n\t\t\t\t\treturn obj;\n\t\t\t\t});\n\t},\n\n\tpush: function(list, items) {\n\t\tvar itemsLength = items.length;\n\t\tif (itemsLength < 4096) {\n\t\t\tlist.push.apply(list, items);\n\t\t} else {\n\t\t\tvar startLength = list.length;\n\t\t\tlist.length += itemsLength;\n\t\t\tfor (var i = 0; i < itemsLength; i++) {\n\t\t\t\tlist[startLength + i] = items[i];\n\t\t\t}\n\t\t}\n\t\treturn list;\n\t},\n\n\tsplice: function(list, items, index, remove) {\n\t\tvar amount = items && items.length,\n\t\t\tappend = index === undefined;\n\t\tindex = append ? list.length : index;\n\t\tif (index > list.length)\n\t\t\tindex = list.length;\n\t\tfor (var i = 0; i < amount; i++)\n\t\t\titems[i]._index = index + i;\n\t\tif (append) {\n\t\t\tBase.push(list, items);\n\t\t\treturn [];\n\t\t} else {\n\t\t\tvar args = [index, remove];\n\t\t\tif (items)\n\t\t\t\tBase.push(args, items);\n\t\t\tvar removed = list.splice.apply(list, args);\n\t\t\tfor (var i = 0, l = removed.length; i < l; i++)\n\t\t\t\tremoved[i]._index = undefined;\n\t\t\tfor (var i = index + amount, l = list.length; i < l; i++)\n\t\t\t\tlist[i]._index = i;\n\t\t\treturn removed;\n\t\t}\n\t},\n\n\tcapitalize: function(str) {\n\t\treturn str.replace(/\\b[a-z]/g, function(match) {\n\t\t\treturn match.toUpperCase();\n\t\t});\n\t},\n\n\tcamelize: function(str) {\n\t\treturn str.replace(/-(.)/g, function(match, chr) {\n\t\t\treturn chr.toUpperCase();\n\t\t});\n\t},\n\n\thyphenate: function(str) {\n\t\treturn str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n\t}\n}});\n\nvar Emitter = {\n\ton: function(type, func) {\n\t\tif (typeof type !== 'string') {\n\t\t\tBase.each(type, function(value, key) {\n\t\t\t\tthis.on(key, value);\n\t\t\t}, this);\n\t\t} else {\n\t\t\tvar types = this._eventTypes,\n\t\t\t\tentry = types && types[type],\n\t\t\t\thandlers = this._callbacks = this._callbacks || {};\n\t\t\thandlers = handlers[type] = handlers[type] || [];\n\t\t\tif (handlers.indexOf(func) === -1) {\n\t\t\t\thandlers.push(func);\n\t\t\t\tif (entry && entry.install && handlers.length === 1)\n\t\t\t\t\tentry.install.call(this, type);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\toff: function(type, func) {\n\t\tif (typeof type !== 'string') {\n\t\t\tBase.each(type, function(value, key) {\n\t\t\t\tthis.off(key, value);\n\t\t\t}, this);\n\t\t\treturn;\n\t\t}\n\t\tvar types = this._eventTypes,\n\t\t\tentry = types && types[type],\n\t\t\thandlers = this._callbacks && this._callbacks[type],\n\t\t\tindex;\n\t\tif (handlers) {\n\t\t\tif (!func || (index = handlers.indexOf(func)) !== -1\n\t\t\t\t\t&& handlers.length === 1) {\n\t\t\t\tif (entry && entry.uninstall)\n\t\t\t\t\tentry.uninstall.call(this, type);\n\t\t\t\tdelete this._callbacks[type];\n\t\t\t} else if (index !== -1) {\n\t\t\t\thandlers.splice(index, 1);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\tonce: function(type, func) {\n\t\treturn this.on(type, function handler() {\n\t\t\tfunc.apply(this, arguments);\n\t\t\tthis.off(type, handler);\n\t\t});\n\t},\n\n\temit: function(type, event) {\n\t\tvar handlers = this._callbacks && this._callbacks[type];\n\t\tif (!handlers)\n\t\t\treturn false;\n\t\tvar args = Base.slice(arguments, 1),\n\t\t\tsetTarget = event && event.target && !event.currentTarget;\n\t\thandlers = handlers.slice();\n\t\tif (setTarget)\n\t\t\tevent.currentTarget = this;\n\t\tfor (var i = 0, l = handlers.length; i < l; i++) {\n\t\t\tif (handlers[i].apply(this, args) == false) {\n\t\t\t\tif (event && event.stop)\n\t\t\t\t\tevent.stop();\n\t\t\t\tbreak;\n\t\t }\n\t\t}\n\t\tif (setTarget)\n\t\t\tdelete event.currentTarget;\n\t\treturn true;\n\t},\n\n\tresponds: function(type) {\n\t\treturn !!(this._callbacks && this._callbacks[type]);\n\t},\n\n\tattach: '#on',\n\tdetach: '#off',\n\tfire: '#emit',\n\n\t_installEvents: function(install) {\n\t\tvar types = this._eventTypes,\n\t\t\thandlers = this._callbacks,\n\t\t\tkey = install ? 'install' : 'uninstall';\n\t\tif (types) {\n\t\t\tfor (var type in handlers) {\n\t\t\t\tif (handlers[type].length > 0) {\n\t\t\t\t\tvar entry = types[type],\n\t\t\t\t\t\tfunc = entry && entry[key];\n\t\t\t\t\tif (func)\n\t\t\t\t\t\tfunc.call(this, type);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tstatics: {\n\t\tinject: function inject(src) {\n\t\t\tvar events = src._events;\n\t\t\tif (events) {\n\t\t\t\tvar types = {};\n\t\t\t\tBase.each(events, function(entry, key) {\n\t\t\t\t\tvar isString = typeof entry === 'string',\n\t\t\t\t\t\tname = isString ? entry : key,\n\t\t\t\t\t\tpart = Base.capitalize(name),\n\t\t\t\t\t\ttype = name.substring(2).toLowerCase();\n\t\t\t\t\ttypes[type] = isString ? {} : entry;\n\t\t\t\t\tname = '_' + name;\n\t\t\t\t\tsrc['get' + part] = function() {\n\t\t\t\t\t\treturn this[name];\n\t\t\t\t\t};\n\t\t\t\t\tsrc['set' + part] = function(func) {\n\t\t\t\t\t\tvar prev = this[name];\n\t\t\t\t\t\tif (prev)\n\t\t\t\t\t\t\tthis.off(type, prev);\n\t\t\t\t\t\tif (func)\n\t\t\t\t\t\t\tthis.on(type, func);\n\t\t\t\t\t\tthis[name] = func;\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tsrc._eventTypes = types;\n\t\t\t}\n\t\t\treturn inject.base.apply(this, arguments);\n\t\t}\n\t}\n};\n\nvar PaperScope = Base.extend({\n\t_class: 'PaperScope',\n\n\tinitialize: function PaperScope() {\n\t\tpaper = this;\n\t\tthis.settings = new Base({\n\t\t\tapplyMatrix: true,\n\t\t\tinsertItems: true,\n\t\t\thandleSize: 4,\n\t\t\thitTolerance: 0\n\t\t});\n\t\tthis.project = null;\n\t\tthis.projects = [];\n\t\tthis.tools = [];\n\t\tthis._id = PaperScope._id++;\n\t\tPaperScope._scopes[this._id] = this;\n\t\tvar proto = PaperScope.prototype;\n\t\tif (!this.support) {\n\t\t\tvar ctx = CanvasProvider.getContext(1, 1) || {};\n\t\t\tproto.support = {\n\t\t\t\tnativeDash: 'setLineDash' in ctx || 'mozDash' in ctx,\n\t\t\t\tnativeBlendModes: BlendMode.nativeModes\n\t\t\t};\n\t\t\tCanvasProvider.release(ctx);\n\t\t}\n\t\tif (!this.agent) {\n\t\t\tvar user = self.navigator.userAgent.toLowerCase(),\n\t\t\t\tos = (/(darwin|win|mac|linux|freebsd|sunos)/.exec(user)||[])[0],\n\t\t\t\tplatform = os === 'darwin' ? 'mac' : os,\n\t\t\t\tagent = proto.agent = proto.browser = { platform: platform };\n\t\t\tif (platform)\n\t\t\t\tagent[platform] = true;\n\t\t\tuser.replace(\n\t\t\t\t/(opera|chrome|safari|webkit|firefox|msie|trident|atom|node|jsdom)\\/?\\s*([.\\d]+)(?:.*version\\/([.\\d]+))?(?:.*rv\\:v?([.\\d]+))?/g,\n\t\t\t\tfunction(match, n, v1, v2, rv) {\n\t\t\t\t\tif (!agent.chrome) {\n\t\t\t\t\t\tvar v = n === 'opera' ? v2 :\n\t\t\t\t\t\t\t\t/^(node|trident)$/.test(n) ? rv : v1;\n\t\t\t\t\t\tagent.version = v;\n\t\t\t\t\t\tagent.versionNumber = parseFloat(v);\n\t\t\t\t\t\tn = { trident: 'msie', jsdom: 'node' }[n] || n;\n\t\t\t\t\t\tagent.name = n;\n\t\t\t\t\t\tagent[n] = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t\tif (agent.chrome)\n\t\t\t\tdelete agent.webkit;\n\t\t\tif (agent.atom)\n\t\t\t\tdelete agent.chrome;\n\t\t}\n\t},\n\n\tversion: \"0.12.18\",\n\n\tgetView: function() {\n\t\tvar project = this.project;\n\t\treturn project && project._view;\n\t},\n\n\tgetPaper: function() {\n\t\treturn this;\n\t},\n\n\texecute: function(code, options) {\n\t\t\tvar exports = paper.PaperScript.execute(code, this, options);\n\t\t\tView.updateFocus();\n\t\t\treturn exports;\n\t},\n\n\tinstall: function(scope) {\n\t\tvar that = this;\n\t\tBase.each(['project', 'view', 'tool'], function(key) {\n\t\t\tBase.define(scope, key, {\n\t\t\t\tconfigurable: true,\n\t\t\t\tget: function() {\n\t\t\t\t\treturn that[key];\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tfor (var key in this)\n\t\t\tif (!/^_/.test(key) && this[key])\n\t\t\t\tscope[key] = this[key];\n\t},\n\n\tsetup: function(element) {\n\t\tpaper = this;\n\t\tthis.project = new Project(element);\n\t\treturn this;\n\t},\n\n\tcreateCanvas: function(width, height) {\n\t\treturn CanvasProvider.getCanvas(width, height);\n\t},\n\n\tactivate: function() {\n\t\tpaper = this;\n\t},\n\n\tclear: function() {\n\t\tvar projects = this.projects,\n\t\t\ttools = this.tools;\n\t\tfor (var i = projects.length - 1; i >= 0; i--)\n\t\t\tprojects[i].remove();\n\t\tfor (var i = tools.length - 1; i >= 0; i--)\n\t\t\ttools[i].remove();\n\t},\n\n\tremove: function() {\n\t\tthis.clear();\n\t\tdelete PaperScope._scopes[this._id];\n\t},\n\n\tstatics: new function() {\n\t\tfunction handleAttribute(name) {\n\t\t\tname += 'Attribute';\n\t\t\treturn function(el, attr) {\n\t\t\t\treturn el[name](attr) || el[name]('data-paper-' + attr);\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\t_scopes: {},\n\t\t\t_id: 0,\n\n\t\t\tget: function(id) {\n\t\t\t\treturn this._scopes[id] || null;\n\t\t\t},\n\n\t\t\tgetAttribute: handleAttribute('get'),\n\t\t\thasAttribute: handleAttribute('has')\n\t\t};\n\t}\n});\n\nvar PaperScopeItem = Base.extend(Emitter, {\n\n\tinitialize: function(activate) {\n\t\tthis._scope = paper;\n\t\tthis._index = this._scope[this._list].push(this) - 1;\n\t\tif (activate || !this._scope[this._reference])\n\t\t\tthis.activate();\n\t},\n\n\tactivate: function() {\n\t\tif (!this._scope)\n\t\t\treturn false;\n\t\tvar prev = this._scope[this._reference];\n\t\tif (prev && prev !== this)\n\t\t\tprev.emit('deactivate');\n\t\tthis._scope[this._reference] = this;\n\t\tthis.emit('activate', prev);\n\t\treturn true;\n\t},\n\n\tisActive: function() {\n\t\treturn this._scope[this._reference] === this;\n\t},\n\n\tremove: function() {\n\t\tif (this._index == null)\n\t\t\treturn false;\n\t\tBase.splice(this._scope[this._list], null, this._index, 1);\n\t\tif (this._scope[this._reference] == this)\n\t\t\tthis._scope[this._reference] = null;\n\t\tthis._scope = null;\n\t\treturn true;\n\t},\n\n\tgetView: function() {\n\t\treturn this._scope.getView();\n\t}\n});\n\nvar CollisionDetection = {\n\tfindItemBoundsCollisions: function(items1, items2, tolerance) {\n\t\tfunction getBounds(items) {\n\t\t\tvar bounds = new Array(items.length);\n\t\t\tfor (var i = 0; i < items.length; i++) {\n\t\t\t\tvar rect = items[i].getBounds();\n\t\t\t\tbounds[i] = [rect.left, rect.top, rect.right, rect.bottom];\n\t\t\t}\n\t\t\treturn bounds;\n\t\t}\n\n\t\tvar bounds1 = getBounds(items1),\n\t\t\tbounds2 = !items2 || items2 === items1\n\t\t\t\t? bounds1\n\t\t\t\t: getBounds(items2);\n\t\treturn this.findBoundsCollisions(bounds1, bounds2, tolerance || 0);\n\t},\n\n\tfindCurveBoundsCollisions: function(curves1, curves2, tolerance, bothAxis) {\n\t\tfunction getBounds(curves) {\n\t\t\tvar min = Math.min,\n\t\t\t\tmax = Math.max,\n\t\t\t\tbounds = new Array(curves.length);\n\t\t\tfor (var i = 0; i < curves.length; i++) {\n\t\t\t\tvar v = curves[i];\n\t\t\t\tbounds[i] = [\n\t\t\t\t\tmin(v[0], v[2], v[4], v[6]),\n\t\t\t\t\tmin(v[1], v[3], v[5], v[7]),\n\t\t\t\t\tmax(v[0], v[2], v[4], v[6]),\n\t\t\t\t\tmax(v[1], v[3], v[5], v[7])\n\t\t\t\t];\n\t\t\t}\n\t\t\treturn bounds;\n\t\t}\n\n\t\tvar bounds1 = getBounds(curves1),\n\t\t\tbounds2 = !curves2 || curves2 === curves1\n\t\t\t\t? bounds1\n\t\t\t\t: getBounds(curves2);\n\t\tif (bothAxis) {\n\t\t\tvar hor = this.findBoundsCollisions(\n\t\t\t\t\tbounds1, bounds2, tolerance || 0, false, true),\n\t\t\t\tver = this.findBoundsCollisions(\n\t\t\t\t\tbounds1, bounds2, tolerance || 0, true, true),\n\t\t\t\tlist = [];\n\t\t\tfor (var i = 0, l = hor.length; i < l; i++) {\n\t\t\t\tlist[i] = { hor: hor[i], ver: ver[i] };\n\t\t\t}\n\t\t\treturn list;\n\t\t}\n\t\treturn this.findBoundsCollisions(bounds1, bounds2, tolerance || 0);\n\t},\n\n\tfindBoundsCollisions: function(boundsA, boundsB, tolerance,\n\t\tsweepVertical, onlySweepAxisCollisions) {\n\t\tvar self = !boundsB || boundsA === boundsB,\n\t\t\tallBounds = self ? boundsA : boundsA.concat(boundsB),\n\t\t\tlengthA = boundsA.length,\n\t\t\tlengthAll = allBounds.length;\n\n\t\tfunction binarySearch(indices, coord, value) {\n\t\t\tvar lo = 0,\n\t\t\t\thi = indices.length;\n\t\t\twhile (lo < hi) {\n\t\t\t\tvar mid = (hi + lo) >>> 1;\n\t\t\t\tif (allBounds[indices[mid]][coord] < value) {\n\t\t\t\t\tlo = mid + 1;\n\t\t\t\t} else {\n\t\t\t\t\thi = mid;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn lo - 1;\n\t\t}\n\n\t\tvar pri0 = sweepVertical ? 1 : 0,\n\t\t\tpri1 = pri0 + 2,\n\t\t\tsec0 = sweepVertical ? 0 : 1,\n\t\t\tsec1 = sec0 + 2;\n\t\tvar allIndicesByPri0 = new Array(lengthAll);\n\t\tfor (var i = 0; i < lengthAll; i++) {\n\t\t\tallIndicesByPri0[i] = i;\n\t\t}\n\t\tallIndicesByPri0.sort(function(i1, i2) {\n\t\t\treturn allBounds[i1][pri0] - allBounds[i2][pri0];\n\t\t});\n\t\tvar activeIndicesByPri1 = [],\n\t\t\tallCollisions = new Array(lengthA);\n\t\tfor (var i = 0; i < lengthAll; i++) {\n\t\t\tvar curIndex = allIndicesByPri0[i],\n\t\t\t\tcurBounds = allBounds[curIndex],\n\t\t\t\torigIndex = self ? curIndex : curIndex - lengthA,\n\t\t\t\tisCurrentA = curIndex < lengthA,\n\t\t\t\tisCurrentB = self || !isCurrentA,\n\t\t\t\tcurCollisions = isCurrentA ? [] : null;\n\t\t\tif (activeIndicesByPri1.length) {\n\t\t\t\tvar pruneCount = binarySearch(activeIndicesByPri1, pri1,\n\t\t\t\t\t\tcurBounds[pri0] - tolerance) + 1;\n\t\t\t\tactiveIndicesByPri1.splice(0, pruneCount);\n\t\t\t\tif (self && onlySweepAxisCollisions) {\n\t\t\t\t\tcurCollisions = curCollisions.concat(activeIndicesByPri1);\n\t\t\t\t\tfor (var j = 0; j < activeIndicesByPri1.length; j++) {\n\t\t\t\t\t\tvar activeIndex = activeIndicesByPri1[j];\n\t\t\t\t\t\tallCollisions[activeIndex].push(origIndex);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tvar curSec1 = curBounds[sec1],\n\t\t\t\t\t\tcurSec0 = curBounds[sec0];\n\t\t\t\t\tfor (var j = 0; j < activeIndicesByPri1.length; j++) {\n\t\t\t\t\t\tvar activeIndex = activeIndicesByPri1[j],\n\t\t\t\t\t\t\tactiveBounds = allBounds[activeIndex],\n\t\t\t\t\t\t\tisActiveA = activeIndex < lengthA,\n\t\t\t\t\t\t\tisActiveB = self || activeIndex >= lengthA;\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tonlySweepAxisCollisions ||\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tisCurrentA && isActiveB ||\n\t\t\t\t\t\t\t\tisCurrentB && isActiveA\n\t\t\t\t\t\t\t) && (\n\t\t\t\t\t\t\t\tcurSec1 >= activeBounds[sec0] - tolerance &&\n\t\t\t\t\t\t\t\tcurSec0 <= activeBounds[sec1] + tolerance\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (isCurrentA && isActiveB) {\n\t\t\t\t\t\t\t\tcurCollisions.push(\n\t\t\t\t\t\t\t\t\tself ? activeIndex : activeIndex - lengthA);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (isCurrentB && isActiveA) {\n\t\t\t\t\t\t\t\tallCollisions[activeIndex].push(origIndex);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isCurrentA) {\n\t\t\t\tif (boundsA === boundsB) {\n\t\t\t\t\tcurCollisions.push(curIndex);\n\t\t\t\t}\n\t\t\t\tallCollisions[curIndex] = curCollisions;\n\t\t\t}\n\t\t\tif (activeIndicesByPri1.length) {\n\t\t\t\tvar curPri1 = curBounds[pri1],\n\t\t\t\t\tindex = binarySearch(activeIndicesByPri1, pri1, curPri1);\n\t\t\t\tactiveIndicesByPri1.splice(index + 1, 0, curIndex);\n\t\t\t} else {\n\t\t\t\tactiveIndicesByPri1.push(curIndex);\n\t\t\t}\n\t\t}\n\t\tfor (var i = 0; i < allCollisions.length; i++) {\n\t\t\tvar collisions = allCollisions[i];\n\t\t\tif (collisions) {\n\t\t\t\tcollisions.sort(function(i1, i2) { return i1 - i2; });\n\t\t\t}\n\t\t}\n\t\treturn allCollisions;\n\t}\n};\n\nvar Formatter = Base.extend({\n\tinitialize: function(precision) {\n\t\tthis.precision = Base.pick(precision, 5);\n\t\tthis.multiplier = Math.pow(10, this.precision);\n\t},\n\n\tnumber: function(val) {\n\t\treturn this.precision < 16\n\t\t\t\t? Math.round(val * this.multiplier) / this.multiplier : val;\n\t},\n\n\tpair: function(val1, val2, separator) {\n\t\treturn this.number(val1) + (separator || ',') + this.number(val2);\n\t},\n\n\tpoint: function(val, separator) {\n\t\treturn this.number(val.x) + (separator || ',') + this.number(val.y);\n\t},\n\n\tsize: function(val, separator) {\n\t\treturn this.number(val.width) + (separator || ',')\n\t\t\t\t+ this.number(val.height);\n\t},\n\n\trectangle: function(val, separator) {\n\t\treturn this.point(val, separator) + (separator || ',')\n\t\t\t\t+ this.size(val, separator);\n\t}\n});\n\nFormatter.instance = new Formatter();\n\nvar Numerical = new function() {\n\n\tvar abscissas = [\n\t\t[ 0.5773502691896257645091488],\n\t\t[0,0.7745966692414833770358531],\n\t\t[ 0.3399810435848562648026658,0.8611363115940525752239465],\n\t\t[0,0.5384693101056830910363144,0.9061798459386639927976269],\n\t\t[ 0.2386191860831969086305017,0.6612093864662645136613996,0.9324695142031520278123016],\n\t\t[0,0.4058451513773971669066064,0.7415311855993944398638648,0.9491079123427585245261897],\n\t\t[ 0.1834346424956498049394761,0.5255324099163289858177390,0.7966664774136267395915539,0.9602898564975362316835609],\n\t\t[0,0.3242534234038089290385380,0.6133714327005903973087020,0.8360311073266357942994298,0.9681602395076260898355762],\n\t\t[ 0.1488743389816312108848260,0.4333953941292471907992659,0.6794095682990244062343274,0.8650633666889845107320967,0.9739065285171717200779640],\n\t\t[0,0.2695431559523449723315320,0.5190961292068118159257257,0.7301520055740493240934163,0.8870625997680952990751578,0.9782286581460569928039380],\n\t\t[ 0.1252334085114689154724414,0.3678314989981801937526915,0.5873179542866174472967024,0.7699026741943046870368938,0.9041172563704748566784659,0.9815606342467192506905491],\n\t\t[0,0.2304583159551347940655281,0.4484927510364468528779129,0.6423493394403402206439846,0.8015780907333099127942065,0.9175983992229779652065478,0.9841830547185881494728294],\n\t\t[ 0.1080549487073436620662447,0.3191123689278897604356718,0.5152486363581540919652907,0.6872929048116854701480198,0.8272013150697649931897947,0.9284348836635735173363911,0.9862838086968123388415973],\n\t\t[0,0.2011940939974345223006283,0.3941513470775633698972074,0.5709721726085388475372267,0.7244177313601700474161861,0.8482065834104272162006483,0.9372733924007059043077589,0.9879925180204854284895657],\n\t\t[ 0.0950125098376374401853193,0.2816035507792589132304605,0.4580167776572273863424194,0.6178762444026437484466718,0.7554044083550030338951012,0.8656312023878317438804679,0.9445750230732325760779884,0.9894009349916499325961542]\n\t];\n\n\tvar weights = [\n\t\t[1],\n\t\t[0.8888888888888888888888889,0.5555555555555555555555556],\n\t\t[0.6521451548625461426269361,0.3478548451374538573730639],\n\t\t[0.5688888888888888888888889,0.4786286704993664680412915,0.2369268850561890875142640],\n\t\t[0.4679139345726910473898703,0.3607615730481386075698335,0.1713244923791703450402961],\n\t\t[0.4179591836734693877551020,0.3818300505051189449503698,0.2797053914892766679014678,0.1294849661688696932706114],\n\t\t[0.3626837833783619829651504,0.3137066458778872873379622,0.2223810344533744705443560,0.1012285362903762591525314],\n\t\t[0.3302393550012597631645251,0.3123470770400028400686304,0.2606106964029354623187429,0.1806481606948574040584720,0.0812743883615744119718922],\n\t\t[0.2955242247147528701738930,0.2692667193099963550912269,0.2190863625159820439955349,0.1494513491505805931457763,0.0666713443086881375935688],\n\t\t[0.2729250867779006307144835,0.2628045445102466621806889,0.2331937645919904799185237,0.1862902109277342514260976,0.1255803694649046246346943,0.0556685671161736664827537],\n\t\t[0.2491470458134027850005624,0.2334925365383548087608499,0.2031674267230659217490645,0.1600783285433462263346525,0.1069393259953184309602547,0.0471753363865118271946160],\n\t\t[0.2325515532308739101945895,0.2262831802628972384120902,0.2078160475368885023125232,0.1781459807619457382800467,0.1388735102197872384636018,0.0921214998377284479144218,0.0404840047653158795200216],\n\t\t[0.2152638534631577901958764,0.2051984637212956039659241,0.1855383974779378137417166,0.1572031671581935345696019,0.1215185706879031846894148,0.0801580871597602098056333,0.0351194603317518630318329],\n\t\t[0.2025782419255612728806202,0.1984314853271115764561183,0.1861610000155622110268006,0.1662692058169939335532009,0.1395706779261543144478048,0.1071592204671719350118695,0.0703660474881081247092674,0.0307532419961172683546284],\n\t\t[0.1894506104550684962853967,0.1826034150449235888667637,0.1691565193950025381893121,0.1495959888165767320815017,0.1246289712555338720524763,0.0951585116824927848099251,0.0622535239386478928628438,0.0271524594117540948517806]\n\t];\n\n\tvar abs = Math.abs,\n\t\tsqrt = Math.sqrt,\n\t\tpow = Math.pow,\n\t\tlog2 = Math.log2 || function(x) {\n\t\t\treturn Math.log(x) * Math.LOG2E;\n\t\t},\n\t\tEPSILON = 1e-12,\n\t\tMACHINE_EPSILON = 1.12e-16;\n\n\tfunction clamp(value, min, max) {\n\t\treturn value < min ? min : value > max ? max : value;\n\t}\n\n\tfunction getDiscriminant(a, b, c) {\n\t\tfunction split(v) {\n\t\t\tvar x = v * 134217729,\n\t\t\t\ty = v - x,\n\t\t\t\thi = y + x,\n\t\t\t\tlo = v - hi;\n\t\t\treturn [hi, lo];\n\t\t}\n\n\t\tvar D = b * b - a * c,\n\t\t\tE = b * b + a * c;\n\t\tif (abs(D) * 3 < E) {\n\t\t\tvar ad = split(a),\n\t\t\t\tbd = split(b),\n\t\t\t\tcd = split(c),\n\t\t\t\tp = b * b,\n\t\t\t\tdp = (bd[0] * bd[0] - p + 2 * bd[0] * bd[1]) + bd[1] * bd[1],\n\t\t\t\tq = a * c,\n\t\t\t\tdq = (ad[0] * cd[0] - q + ad[0] * cd[1] + ad[1] * cd[0])\n\t\t\t\t\t\t+ ad[1] * cd[1];\n\t\t\tD = (p - q) + (dp - dq);\n\t\t}\n\t\treturn D;\n\t}\n\n\tfunction getNormalizationFactor() {\n\t\tvar norm = Math.max.apply(Math, arguments);\n\t\treturn norm && (norm < 1e-8 || norm > 1e8)\n\t\t\t\t? pow(2, -Math.round(log2(norm)))\n\t\t\t\t: 0;\n\t}\n\n\treturn {\n\t\tEPSILON: EPSILON,\n\t\tMACHINE_EPSILON: MACHINE_EPSILON,\n\t\tCURVETIME_EPSILON: 1e-8,\n\t\tGEOMETRIC_EPSILON: 1e-7,\n\t\tTRIGONOMETRIC_EPSILON: 1e-8,\n\t\tANGULAR_EPSILON: 1e-5,\n\t\tKAPPA: 4 * (sqrt(2) - 1) / 3,\n\n\t\tisZero: function(val) {\n\t\t\treturn val >= -EPSILON && val <= EPSILON;\n\t\t},\n\n\t\tisMachineZero: function(val) {\n\t\t\treturn val >= -MACHINE_EPSILON && val <= MACHINE_EPSILON;\n\t\t},\n\n\t\tclamp: clamp,\n\n\t\tintegrate: function(f, a, b, n) {\n\t\t\tvar x = abscissas[n - 2],\n\t\t\t\tw = weights[n - 2],\n\t\t\t\tA = (b - a) * 0.5,\n\t\t\t\tB = A + a,\n\t\t\t\ti = 0,\n\t\t\t\tm = (n + 1) >> 1,\n\t\t\t\tsum = n & 1 ? w[i++] * f(B) : 0;\n\t\t\twhile (i < m) {\n\t\t\t\tvar Ax = A * x[i];\n\t\t\t\tsum += w[i++] * (f(B + Ax) + f(B - Ax));\n\t\t\t}\n\t\t\treturn A * sum;\n\t\t},\n\n\t\tfindRoot: function(f, df, x, a, b, n, tolerance) {\n\t\t\tfor (var i = 0; i < n; i++) {\n\t\t\t\tvar fx = f(x),\n\t\t\t\t\tdx = fx / df(x),\n\t\t\t\t\tnx = x - dx;\n\t\t\t\tif (abs(dx) < tolerance) {\n\t\t\t\t\tx = nx;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (fx > 0) {\n\t\t\t\t\tb = x;\n\t\t\t\t\tx = nx <= a ? (a + b) * 0.5 : nx;\n\t\t\t\t} else {\n\t\t\t\t\ta = x;\n\t\t\t\t\tx = nx >= b ? (a + b) * 0.5 : nx;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn clamp(x, a, b);\n\t\t},\n\n\t\tsolveQuadratic: function(a, b, c, roots, min, max) {\n\t\t\tvar x1, x2 = Infinity;\n\t\t\tif (abs(a) < EPSILON) {\n\t\t\t\tif (abs(b) < EPSILON)\n\t\t\t\t\treturn abs(c) < EPSILON ? -1 : 0;\n\t\t\t\tx1 = -c / b;\n\t\t\t} else {\n\t\t\t\tb *= -0.5;\n\t\t\t\tvar D = getDiscriminant(a, b, c);\n\t\t\t\tif (D && abs(D) < MACHINE_EPSILON) {\n\t\t\t\t\tvar f = getNormalizationFactor(abs(a), abs(b), abs(c));\n\t\t\t\t\tif (f) {\n\t\t\t\t\t\ta *= f;\n\t\t\t\t\t\tb *= f;\n\t\t\t\t\t\tc *= f;\n\t\t\t\t\t\tD = getDiscriminant(a, b, c);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (D >= -MACHINE_EPSILON) {\n\t\t\t\t\tvar Q = D < 0 ? 0 : sqrt(D),\n\t\t\t\t\t\tR = b + (b < 0 ? -Q : Q);\n\t\t\t\t\tif (R === 0) {\n\t\t\t\t\t\tx1 = c / a;\n\t\t\t\t\t\tx2 = -x1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tx1 = R / a;\n\t\t\t\t\t\tx2 = c / R;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar count = 0,\n\t\t\t\tboundless = min == null,\n\t\t\t\tminB = min - EPSILON,\n\t\t\t\tmaxB = max + EPSILON;\n\t\t\tif (isFinite(x1) && (boundless || x1 > minB && x1 < maxB))\n\t\t\t\troots[count++] = boundless ? x1 : clamp(x1, min, max);\n\t\t\tif (x2 !== x1\n\t\t\t\t\t&& isFinite(x2) && (boundless || x2 > minB && x2 < maxB))\n\t\t\t\troots[count++] = boundless ? x2 : clamp(x2, min, max);\n\t\t\treturn count;\n\t\t},\n\n\t\tsolveCubic: function(a, b, c, d, roots, min, max) {\n\t\t\tvar f = getNormalizationFactor(abs(a), abs(b), abs(c), abs(d)),\n\t\t\t\tx, b1, c2, qd, q;\n\t\t\tif (f) {\n\t\t\t\ta *= f;\n\t\t\t\tb *= f;\n\t\t\t\tc *= f;\n\t\t\t\td *= f;\n\t\t\t}\n\n\t\t\tfunction evaluate(x0) {\n\t\t\t\tx = x0;\n\t\t\t\tvar tmp = a * x;\n\t\t\t\tb1 = tmp + b;\n\t\t\t\tc2 = b1 * x + c;\n\t\t\t\tqd = (tmp + b1) * x + c2;\n\t\t\t\tq = c2 * x + d;\n\t\t\t}\n\n\t\t\tif (abs(a) < EPSILON) {\n\t\t\t\ta = b;\n\t\t\t\tb1 = c;\n\t\t\t\tc2 = d;\n\t\t\t\tx = Infinity;\n\t\t\t} else if (abs(d) < EPSILON) {\n\t\t\t\tb1 = b;\n\t\t\t\tc2 = c;\n\t\t\t\tx = 0;\n\t\t\t} else {\n\t\t\t\tevaluate(-(b / a) / 3);\n\t\t\t\tvar t = q / a,\n\t\t\t\t\tr = pow(abs(t), 1/3),\n\t\t\t\t\ts = t < 0 ? -1 : 1,\n\t\t\t\t\ttd = -qd / a,\n\t\t\t\t\trd = td > 0 ? 1.324717957244746 * Math.max(r, sqrt(td)) : r,\n\t\t\t\t\tx0 = x - s * rd;\n\t\t\t\tif (x0 !== x) {\n\t\t\t\t\tdo {\n\t\t\t\t\t\tevaluate(x0);\n\t\t\t\t\t\tx0 = qd === 0 ? x : x - q / qd / (1 + MACHINE_EPSILON);\n\t\t\t\t\t} while (s * x0 > s * x);\n\t\t\t\t\tif (abs(a) * x * x > abs(d / x)) {\n\t\t\t\t\t\tc2 = -d / x;\n\t\t\t\t\t\tb1 = (c2 - c) / x;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar count = Numerical.solveQuadratic(a, b1, c2, roots, min, max),\n\t\t\t\tboundless = min == null;\n\t\t\tif (isFinite(x) && (count === 0\n\t\t\t\t\t|| count > 0 && x !== roots[0] && x !== roots[1])\n\t\t\t\t\t&& (boundless || x > min - EPSILON && x < max + EPSILON))\n\t\t\t\troots[count++] = boundless ? x : clamp(x, min, max);\n\t\t\treturn count;\n\t\t}\n\t};\n};\n\nvar UID = {\n\t_id: 1,\n\t_pools: {},\n\n\tget: function(name) {\n\t\tif (name) {\n\t\t\tvar pool = this._pools[name];\n\t\t\tif (!pool)\n\t\t\t\tpool = this._pools[name] = { _id: 1 };\n\t\t\treturn pool._id++;\n\t\t} else {\n\t\t\treturn this._id++;\n\t\t}\n\t}\n};\n\nvar Point = Base.extend({\n\t_class: 'Point',\n\t_readIndex: true,\n\n\tinitialize: function Point(arg0, arg1) {\n\t\tvar type = typeof arg0,\n\t\t\treading = this.__read,\n\t\t\tread = 0;\n\t\tif (type === 'number') {\n\t\t\tvar hasY = typeof arg1 === 'number';\n\t\t\tthis._set(arg0, hasY ? arg1 : arg0);\n\t\t\tif (reading)\n\t\t\t\tread = hasY ? 2 : 1;\n\t\t} else if (type === 'undefined' || arg0 === null) {\n\t\t\tthis._set(0, 0);\n\t\t\tif (reading)\n\t\t\t\tread = arg0 === null ? 1 : 0;\n\t\t} else {\n\t\t\tvar obj = type === 'string' ? arg0.split(/[\\s,]+/) || [] : arg0;\n\t\t\tread = 1;\n\t\t\tif (Array.isArray(obj)) {\n\t\t\t\tthis._set(+obj[0], +(obj.length > 1 ? obj[1] : obj[0]));\n\t\t\t} else if ('x' in obj) {\n\t\t\t\tthis._set(obj.x || 0, obj.y || 0);\n\t\t\t} else if ('width' in obj) {\n\t\t\t\tthis._set(obj.width || 0, obj.height || 0);\n\t\t\t} else if ('angle' in obj) {\n\t\t\t\tthis._set(obj.length || 0, 0);\n\t\t\t\tthis.setAngle(obj.angle || 0);\n\t\t\t} else {\n\t\t\t\tthis._set(0, 0);\n\t\t\t\tread = 0;\n\t\t\t}\n\t\t}\n\t\tif (reading)\n\t\t\tthis.__read = read;\n\t\treturn this;\n\t},\n\n\tset: '#initialize',\n\n\t_set: function(x, y) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\treturn this;\n\t},\n\n\tequals: function(point) {\n\t\treturn this === point || point\n\t\t\t\t&& (this.x === point.x && this.y === point.y\n\t\t\t\t\t|| Array.isArray(point)\n\t\t\t\t\t\t&& this.x === point[0] && this.y === point[1])\n\t\t\t\t|| false;\n\t},\n\n\tclone: function() {\n\t\treturn new Point(this.x, this.y);\n\t},\n\n\ttoString: function() {\n\t\tvar f = Formatter.instance;\n\t\treturn '{ x: ' + f.number(this.x) + ', y: ' + f.number(this.y) + ' }';\n\t},\n\n\t_serialize: function(options) {\n\t\tvar f = options.formatter;\n\t\treturn [f.number(this.x), f.number(this.y)];\n\t},\n\n\tgetLength: function() {\n\t\treturn Math.sqrt(this.x * this.x + this.y * this.y);\n\t},\n\n\tsetLength: function(length) {\n\t\tif (this.isZero()) {\n\t\t\tvar angle = this._angle || 0;\n\t\t\tthis._set(\n\t\t\t\tMath.cos(angle) * length,\n\t\t\t\tMath.sin(angle) * length\n\t\t\t);\n\t\t} else {\n\t\t\tvar scale = length / this.getLength();\n\t\t\tif (Numerical.isZero(scale))\n\t\t\t\tthis.getAngle();\n\t\t\tthis._set(\n\t\t\t\tthis.x * scale,\n\t\t\t\tthis.y * scale\n\t\t\t);\n\t\t}\n\t},\n\tgetAngle: function() {\n\t\treturn this.getAngleInRadians.apply(this, arguments) * 180 / Math.PI;\n\t},\n\n\tsetAngle: function(angle) {\n\t\tthis.setAngleInRadians.call(this, angle * Math.PI / 180);\n\t},\n\n\tgetAngleInDegrees: '#getAngle',\n\tsetAngleInDegrees: '#setAngle',\n\n\tgetAngleInRadians: function() {\n\t\tif (!arguments.length) {\n\t\t\treturn this.isZero()\n\t\t\t\t\t? this._angle || 0\n\t\t\t\t\t: this._angle = Math.atan2(this.y, this.x);\n\t\t} else {\n\t\t\tvar point = Point.read(arguments),\n\t\t\t\tdiv = this.getLength() * point.getLength();\n\t\t\tif (Numerical.isZero(div)) {\n\t\t\t\treturn NaN;\n\t\t\t} else {\n\t\t\t\tvar a = this.dot(point) / div;\n\t\t\t\treturn Math.acos(a < -1 ? -1 : a > 1 ? 1 : a);\n\t\t\t}\n\t\t}\n\t},\n\n\tsetAngleInRadians: function(angle) {\n\t\tthis._angle = angle;\n\t\tif (!this.isZero()) {\n\t\t\tvar length = this.getLength();\n\t\t\tthis._set(\n\t\t\t\tMath.cos(angle) * length,\n\t\t\t\tMath.sin(angle) * length\n\t\t\t);\n\t\t}\n\t},\n\n\tgetQuadrant: function() {\n\t\treturn this.x >= 0 ? this.y >= 0 ? 1 : 4 : this.y >= 0 ? 2 : 3;\n\t}\n}, {\n\tbeans: false,\n\n\tgetDirectedAngle: function() {\n\t\tvar point = Point.read(arguments);\n\t\treturn Math.atan2(this.cross(point), this.dot(point)) * 180 / Math.PI;\n\t},\n\n\tgetDistance: function() {\n\t\tvar args = arguments,\n\t\t\tpoint = Point.read(args),\n\t\t\tx = point.x - this.x,\n\t\t\ty = point.y - this.y,\n\t\t\td = x * x + y * y,\n\t\t\tsquared = Base.read(args);\n\t\treturn squared ? d : Math.sqrt(d);\n\t},\n\n\tnormalize: function(length) {\n\t\tif (length === undefined)\n\t\t\tlength = 1;\n\t\tvar current = this.getLength(),\n\t\t\tscale = current !== 0 ? length / current : 0,\n\t\t\tpoint = new Point(this.x * scale, this.y * scale);\n\t\tif (scale >= 0)\n\t\t\tpoint._angle = this._angle;\n\t\treturn point;\n\t},\n\n\trotate: function(angle, center) {\n\t\tif (angle === 0)\n\t\t\treturn this.clone();\n\t\tangle = angle * Math.PI / 180;\n\t\tvar point = center ? this.subtract(center) : this,\n\t\t\tsin = Math.sin(angle),\n\t\t\tcos = Math.cos(angle);\n\t\tpoint = new Point(\n\t\t\tpoint.x * cos - point.y * sin,\n\t\t\tpoint.x * sin + point.y * cos\n\t\t);\n\t\treturn center ? point.add(center) : point;\n\t},\n\n\ttransform: function(matrix) {\n\t\treturn matrix ? matrix._transformPoint(this) : this;\n\t},\n\n\tadd: function() {\n\t\tvar point = Point.read(arguments);\n\t\treturn new Point(this.x + point.x, this.y + point.y);\n\t},\n\n\tsubtract: function() {\n\t\tvar point = Point.read(arguments);\n\t\treturn new Point(this.x - point.x, this.y - point.y);\n\t},\n\n\tmultiply: function() {\n\t\tvar point = Point.read(arguments);\n\t\treturn new Point(this.x * point.x, this.y * point.y);\n\t},\n\n\tdivide: function() {\n\t\tvar point = Point.read(arguments);\n\t\treturn new Point(this.x / point.x, this.y / point.y);\n\t},\n\n\tmodulo: function() {\n\t\tvar point = Point.read(arguments);\n\t\treturn new Point(this.x % point.x, this.y % point.y);\n\t},\n\n\tnegate: function() {\n\t\treturn new Point(-this.x, -this.y);\n\t},\n\n\tisInside: function() {\n\t\treturn Rectangle.read(arguments).contains(this);\n\t},\n\n\tisClose: function() {\n\t\tvar args = arguments,\n\t\t\tpoint = Point.read(args),\n\t\t\ttolerance = Base.read(args);\n\t\treturn this.getDistance(point) <= tolerance;\n\t},\n\n\tisCollinear: function() {\n\t\tvar point = Point.read(arguments);\n\t\treturn Point.isCollinear(this.x, this.y, point.x, point.y);\n\t},\n\n\tisColinear: '#isCollinear',\n\n\tisOrthogonal: function() {\n\t\tvar point = Point.read(arguments);\n\t\treturn Point.isOrthogonal(this.x, this.y, point.x, point.y);\n\t},\n\n\tisZero: function() {\n\t\tvar isZero = Numerical.isZero;\n\t\treturn isZero(this.x) && isZero(this.y);\n\t},\n\n\tisNaN: function() {\n\t\treturn isNaN(this.x) || isNaN(this.y);\n\t},\n\n\tisInQuadrant: function(q) {\n\t\treturn this.x * (q > 1 && q < 4 ? -1 : 1) >= 0\n\t\t\t&& this.y * (q > 2 ? -1 : 1) >= 0;\n\t},\n\n\tdot: function() {\n\t\tvar point = Point.read(arguments);\n\t\treturn this.x * point.x + this.y * point.y;\n\t},\n\n\tcross: function() {\n\t\tvar point = Point.read(arguments);\n\t\treturn this.x * point.y - this.y * point.x;\n\t},\n\n\tproject: function() {\n\t\tvar point = Point.read(arguments),\n\t\t\tscale = point.isZero() ? 0 : this.dot(point) / point.dot(point);\n\t\treturn new Point(\n\t\t\tpoint.x * scale,\n\t\t\tpoint.y * scale\n\t\t);\n\t},\n\n\tstatics: {\n\t\tmin: function() {\n\t\t\tvar args = arguments,\n\t\t\t\tpoint1 = Point.read(args),\n\t\t\t\tpoint2 = Point.read(args);\n\t\t\treturn new Point(\n\t\t\t\tMath.min(point1.x, point2.x),\n\t\t\t\tMath.min(point1.y, point2.y)\n\t\t\t);\n\t\t},\n\n\t\tmax: function() {\n\t\t\tvar args = arguments,\n\t\t\t\tpoint1 = Point.read(args),\n\t\t\t\tpoint2 = Point.read(args);\n\t\t\treturn new Point(\n\t\t\t\tMath.max(point1.x, point2.x),\n\t\t\t\tMath.max(point1.y, point2.y)\n\t\t\t);\n\t\t},\n\n\t\trandom: function() {\n\t\t\treturn new Point(Math.random(), Math.random());\n\t\t},\n\n\t\tisCollinear: function(x1, y1, x2, y2) {\n\t\t\treturn Math.abs(x1 * y2 - y1 * x2)\n\t\t\t\t\t<= Math.sqrt((x1 * x1 + y1 * y1) * (x2 * x2 + y2 * y2))\n\t\t\t\t\t\t* 1e-8;\n\t\t},\n\n\t\tisOrthogonal: function(x1, y1, x2, y2) {\n\t\t\treturn Math.abs(x1 * x2 + y1 * y2)\n\t\t\t\t\t<= Math.sqrt((x1 * x1 + y1 * y1) * (x2 * x2 + y2 * y2))\n\t\t\t\t\t\t* 1e-8;\n\t\t}\n\t}\n}, Base.each(['round', 'ceil', 'floor', 'abs'], function(key) {\n\tvar op = Math[key];\n\tthis[key] = function() {\n\t\treturn new Point(op(this.x), op(this.y));\n\t};\n}, {}));\n\nvar LinkedPoint = Point.extend({\n\tinitialize: function Point(x, y, owner, setter) {\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._owner = owner;\n\t\tthis._setter = setter;\n\t},\n\n\t_set: function(x, y, _dontNotify) {\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tif (!_dontNotify)\n\t\t\tthis._owner[this._setter](this);\n\t\treturn this;\n\t},\n\n\tgetX: function() {\n\t\treturn this._x;\n\t},\n\n\tsetX: function(x) {\n\t\tthis._x = x;\n\t\tthis._owner[this._setter](this);\n\t},\n\n\tgetY: function() {\n\t\treturn this._y;\n\t},\n\n\tsetY: function(y) {\n\t\tthis._y = y;\n\t\tthis._owner[this._setter](this);\n\t},\n\n\tisSelected: function() {\n\t\treturn !!(this._owner._selection & this._getSelection());\n\t},\n\n\tsetSelected: function(selected) {\n\t\tthis._owner._changeSelection(this._getSelection(), selected);\n\t},\n\n\t_getSelection: function() {\n\t\treturn this._setter === 'setPosition' ? 4 : 0;\n\t}\n});\n\nvar Size = Base.extend({\n\t_class: 'Size',\n\t_readIndex: true,\n\n\tinitialize: function Size(arg0, arg1) {\n\t\tvar type = typeof arg0,\n\t\t\treading = this.__read,\n\t\t\tread = 0;\n\t\tif (type === 'number') {\n\t\t\tvar hasHeight = typeof arg1 === 'number';\n\t\t\tthis._set(arg0, hasHeight ? arg1 : arg0);\n\t\t\tif (reading)\n\t\t\t\tread = hasHeight ? 2 : 1;\n\t\t} else if (type === 'undefined' || arg0 === null) {\n\t\t\tthis._set(0, 0);\n\t\t\tif (reading)\n\t\t\t\tread = arg0 === null ? 1 : 0;\n\t\t} else {\n\t\t\tvar obj = type === 'string' ? arg0.split(/[\\s,]+/) || [] : arg0;\n\t\t\tread = 1;\n\t\t\tif (Array.isArray(obj)) {\n\t\t\t\tthis._set(+obj[0], +(obj.length > 1 ? obj[1] : obj[0]));\n\t\t\t} else if ('width' in obj) {\n\t\t\t\tthis._set(obj.width || 0, obj.height || 0);\n\t\t\t} else if ('x' in obj) {\n\t\t\t\tthis._set(obj.x || 0, obj.y || 0);\n\t\t\t} else {\n\t\t\t\tthis._set(0, 0);\n\t\t\t\tread = 0;\n\t\t\t}\n\t\t}\n\t\tif (reading)\n\t\t\tthis.__read = read;\n\t\treturn this;\n\t},\n\n\tset: '#initialize',\n\n\t_set: function(width, height) {\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\treturn this;\n\t},\n\n\tequals: function(size) {\n\t\treturn size === this || size && (this.width === size.width\n\t\t\t\t&& this.height === size.height\n\t\t\t\t|| Array.isArray(size) && this.width === size[0]\n\t\t\t\t\t&& this.height === size[1]) || false;\n\t},\n\n\tclone: function() {\n\t\treturn new Size(this.width, this.height);\n\t},\n\n\ttoString: function() {\n\t\tvar f = Formatter.instance;\n\t\treturn '{ width: ' + f.number(this.width)\n\t\t\t\t+ ', height: ' + f.number(this.height) + ' }';\n\t},\n\n\t_serialize: function(options) {\n\t\tvar f = options.formatter;\n\t\treturn [f.number(this.width),\n\t\t\t\tf.number(this.height)];\n\t},\n\n\tadd: function() {\n\t\tvar size = Size.read(arguments);\n\t\treturn new Size(this.width + size.width, this.height + size.height);\n\t},\n\n\tsubtract: function() {\n\t\tvar size = Size.read(arguments);\n\t\treturn new Size(this.width - size.width, this.height - size.height);\n\t},\n\n\tmultiply: function() {\n\t\tvar size = Size.read(arguments);\n\t\treturn new Size(this.width * size.width, this.height * size.height);\n\t},\n\n\tdivide: function() {\n\t\tvar size = Size.read(arguments);\n\t\treturn new Size(this.width / size.width, this.height / size.height);\n\t},\n\n\tmodulo: function() {\n\t\tvar size = Size.read(arguments);\n\t\treturn new Size(this.width % size.width, this.height % size.height);\n\t},\n\n\tnegate: function() {\n\t\treturn new Size(-this.width, -this.height);\n\t},\n\n\tisZero: function() {\n\t\tvar isZero = Numerical.isZero;\n\t\treturn isZero(this.width) && isZero(this.height);\n\t},\n\n\tisNaN: function() {\n\t\treturn isNaN(this.width) || isNaN(this.height);\n\t},\n\n\tstatics: {\n\t\tmin: function(size1, size2) {\n\t\t\treturn new Size(\n\t\t\t\tMath.min(size1.width, size2.width),\n\t\t\t\tMath.min(size1.height, size2.height));\n\t\t},\n\n\t\tmax: function(size1, size2) {\n\t\t\treturn new Size(\n\t\t\t\tMath.max(size1.width, size2.width),\n\t\t\t\tMath.max(size1.height, size2.height));\n\t\t},\n\n\t\trandom: function() {\n\t\t\treturn new Size(Math.random(), Math.random());\n\t\t}\n\t}\n}, Base.each(['round', 'ceil', 'floor', 'abs'], function(key) {\n\tvar op = Math[key];\n\tthis[key] = function() {\n\t\treturn new Size(op(this.width), op(this.height));\n\t};\n}, {}));\n\nvar LinkedSize = Size.extend({\n\tinitialize: function Size(width, height, owner, setter) {\n\t\tthis._width = width;\n\t\tthis._height = height;\n\t\tthis._owner = owner;\n\t\tthis._setter = setter;\n\t},\n\n\t_set: function(width, height, _dontNotify) {\n\t\tthis._width = width;\n\t\tthis._height = height;\n\t\tif (!_dontNotify)\n\t\t\tthis._owner[this._setter](this);\n\t\treturn this;\n\t},\n\n\tgetWidth: function() {\n\t\treturn this._width;\n\t},\n\n\tsetWidth: function(width) {\n\t\tthis._width = width;\n\t\tthis._owner[this._setter](this);\n\t},\n\n\tgetHeight: function() {\n\t\treturn this._height;\n\t},\n\n\tsetHeight: function(height) {\n\t\tthis._height = height;\n\t\tthis._owner[this._setter](this);\n\t}\n});\n\nvar Rectangle = Base.extend({\n\t_class: 'Rectangle',\n\t_readIndex: true,\n\tbeans: true,\n\n\tinitialize: function Rectangle(arg0, arg1, arg2, arg3) {\n\t\tvar args = arguments,\n\t\t\ttype = typeof arg0,\n\t\t\tread;\n\t\tif (type === 'number') {\n\t\t\tthis._set(arg0, arg1, arg2, arg3);\n\t\t\tread = 4;\n\t\t} else if (type === 'undefined' || arg0 === null) {\n\t\t\tthis._set(0, 0, 0, 0);\n\t\t\tread = arg0 === null ? 1 : 0;\n\t\t} else if (args.length === 1) {\n\t\t\tif (Array.isArray(arg0)) {\n\t\t\t\tthis._set.apply(this, arg0);\n\t\t\t\tread = 1;\n\t\t\t} else if (arg0.x !== undefined || arg0.width !== undefined) {\n\t\t\t\tthis._set(arg0.x || 0, arg0.y || 0,\n\t\t\t\t\t\targ0.width || 0, arg0.height || 0);\n\t\t\t\tread = 1;\n\t\t\t} else if (arg0.from === undefined && arg0.to === undefined) {\n\t\t\t\tthis._set(0, 0, 0, 0);\n\t\t\t\tif (Base.readSupported(args, this)) {\n\t\t\t\t\tread = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (read === undefined) {\n\t\t\tvar frm = Point.readNamed(args, 'from'),\n\t\t\t\tnext = Base.peek(args),\n\t\t\t\tx = frm.x,\n\t\t\t\ty = frm.y,\n\t\t\t\twidth,\n\t\t\t\theight;\n\t\t\tif (next && next.x !== undefined || Base.hasNamed(args, 'to')) {\n\t\t\t\tvar to = Point.readNamed(args, 'to');\n\t\t\t\twidth = to.x - x;\n\t\t\t\theight = to.y - y;\n\t\t\t\tif (width < 0) {\n\t\t\t\t\tx = to.x;\n\t\t\t\t\twidth = -width;\n\t\t\t\t}\n\t\t\t\tif (height < 0) {\n\t\t\t\t\ty = to.y;\n\t\t\t\t\theight = -height;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar size = Size.read(args);\n\t\t\t\twidth = size.width;\n\t\t\t\theight = size.height;\n\t\t\t}\n\t\t\tthis._set(x, y, width, height);\n\t\t\tread = args.__index;\n\t\t}\n\t\tvar filtered = args.__filtered;\n\t\tif (filtered)\n\t\t\tthis.__filtered = filtered;\n\t\tif (this.__read)\n\t\t\tthis.__read = read;\n\t\treturn this;\n\t},\n\n\tset: '#initialize',\n\n\t_set: function(x, y, width, height) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\treturn this;\n\t},\n\n\tclone: function() {\n\t\treturn new Rectangle(this.x, this.y, this.width, this.height);\n\t},\n\n\tequals: function(rect) {\n\t\tvar rt = Base.isPlainValue(rect)\n\t\t\t\t? Rectangle.read(arguments)\n\t\t\t\t: rect;\n\t\treturn rt === this\n\t\t\t\t|| rt && this.x === rt.x && this.y === rt.y\n\t\t\t\t\t&& this.width === rt.width && this.height === rt.height\n\t\t\t\t|| false;\n\t},\n\n\ttoString: function() {\n\t\tvar f = Formatter.instance;\n\t\treturn '{ x: ' + f.number(this.x)\n\t\t\t\t+ ', y: ' + f.number(this.y)\n\t\t\t\t+ ', width: ' + f.number(this.width)\n\t\t\t\t+ ', height: ' + f.number(this.height)\n\t\t\t\t+ ' }';\n\t},\n\n\t_serialize: function(options) {\n\t\tvar f = options.formatter;\n\t\treturn [f.number(this.x),\n\t\t\t\tf.number(this.y),\n\t\t\t\tf.number(this.width),\n\t\t\t\tf.number(this.height)];\n\t},\n\n\tgetPoint: function(_dontLink) {\n\t\tvar ctor = _dontLink ? Point : LinkedPoint;\n\t\treturn new ctor(this.x, this.y, this, 'setPoint');\n\t},\n\n\tsetPoint: function() {\n\t\tvar point = Point.read(arguments);\n\t\tthis.x = point.x;\n\t\tthis.y = point.y;\n\t},\n\n\tgetSize: function(_dontLink) {\n\t\tvar ctor = _dontLink ? Size : LinkedSize;\n\t\treturn new ctor(this.width, this.height, this, 'setSize');\n\t},\n\n\t_fw: 1,\n\t_fh: 1,\n\n\tsetSize: function() {\n\t\tvar size = Size.read(arguments),\n\t\t\tsx = this._sx,\n\t\t\tsy = this._sy,\n\t\t\tw = size.width,\n\t\t\th = size.height;\n\t\tif (sx) {\n\t\t\tthis.x += (this.width - w) * sx;\n\t\t}\n\t\tif (sy) {\n\t\t\tthis.y += (this.height - h) * sy;\n\t\t}\n\t\tthis.width = w;\n\t\tthis.height = h;\n\t\tthis._fw = this._fh = 1;\n\t},\n\n\tgetLeft: function() {\n\t\treturn this.x;\n\t},\n\n\tsetLeft: function(left) {\n\t\tif (!this._fw) {\n\t\t\tvar amount = left - this.x;\n\t\t\tthis.width -= this._sx === 0.5 ? amount * 2 : amount;\n\t\t}\n\t\tthis.x = left;\n\t\tthis._sx = this._fw = 0;\n\t},\n\n\tgetTop: function() {\n\t\treturn this.y;\n\t},\n\n\tsetTop: function(top) {\n\t\tif (!this._fh) {\n\t\t\tvar amount = top - this.y;\n\t\t\tthis.height -= this._sy === 0.5 ? amount * 2 : amount;\n\t\t}\n\t\tthis.y = top;\n\t\tthis._sy = this._fh = 0;\n\t},\n\n\tgetRight: function() {\n\t\treturn this.x + this.width;\n\t},\n\n\tsetRight: function(right) {\n\t\tif (!this._fw) {\n\t\t\tvar amount = right - this.x;\n\t\t\tthis.width = this._sx === 0.5 ? amount * 2 : amount;\n\t\t}\n\t\tthis.x = right - this.width;\n\t\tthis._sx = 1;\n\t\tthis._fw = 0;\n\t},\n\n\tgetBottom: function() {\n\t\treturn this.y + this.height;\n\t},\n\n\tsetBottom: function(bottom) {\n\t\tif (!this._fh) {\n\t\t\tvar amount = bottom - this.y;\n\t\t\tthis.height = this._sy === 0.5 ? amount * 2 : amount;\n\t\t}\n\t\tthis.y = bottom - this.height;\n\t\tthis._sy = 1;\n\t\tthis._fh = 0;\n\t},\n\n\tgetCenterX: function() {\n\t\treturn this.x + this.width / 2;\n\t},\n\n\tsetCenterX: function(x) {\n\t\tif (this._fw || this._sx === 0.5) {\n\t\t\tthis.x = x - this.width / 2;\n\t\t} else {\n\t\t\tif (this._sx) {\n\t\t\t\tthis.x += (x - this.x) * 2 * this._sx;\n\t\t\t}\n\t\t\tthis.width = (x - this.x) * 2;\n\t\t}\n\t\tthis._sx = 0.5;\n\t\tthis._fw = 0;\n\t},\n\n\tgetCenterY: function() {\n\t\treturn this.y + this.height / 2;\n\t},\n\n\tsetCenterY: function(y) {\n\t\tif (this._fh || this._sy === 0.5) {\n\t\t\tthis.y = y - this.height / 2;\n\t\t} else {\n\t\t\tif (this._sy) {\n\t\t\t\tthis.y += (y - this.y) * 2 * this._sy;\n\t\t\t}\n\t\t\tthis.height = (y - this.y) * 2;\n\t\t}\n\t\tthis._sy = 0.5;\n\t\tthis._fh = 0;\n\t},\n\n\tgetCenter: function(_dontLink) {\n\t\tvar ctor = _dontLink ? Point : LinkedPoint;\n\t\treturn new ctor(this.getCenterX(), this.getCenterY(), this, 'setCenter');\n\t},\n\n\tsetCenter: function() {\n\t\tvar point = Point.read(arguments);\n\t\tthis.setCenterX(point.x);\n\t\tthis.setCenterY(point.y);\n\t\treturn this;\n\t},\n\n\tgetArea: function() {\n\t\treturn this.width * this.height;\n\t},\n\n\tisEmpty: function() {\n\t\treturn this.width === 0 || this.height === 0;\n\t},\n\n\tcontains: function(arg) {\n\t\treturn arg && arg.width !== undefined\n\t\t\t\t|| (Array.isArray(arg) ? arg : arguments).length === 4\n\t\t\t\t? this._containsRectangle(Rectangle.read(arguments))\n\t\t\t\t: this._containsPoint(Point.read(arguments));\n\t},\n\n\t_containsPoint: function(point) {\n\t\tvar x = point.x,\n\t\t\ty = point.y;\n\t\treturn x >= this.x && y >= this.y\n\t\t\t\t&& x <= this.x + this.width\n\t\t\t\t&& y <= this.y + this.height;\n\t},\n\n\t_containsRectangle: function(rect) {\n\t\tvar x = rect.x,\n\t\t\ty = rect.y;\n\t\treturn x >= this.x && y >= this.y\n\t\t\t\t&& x + rect.width <= this.x + this.width\n\t\t\t\t&& y + rect.height <= this.y + this.height;\n\t},\n\n\tintersects: function() {\n\t\tvar rect = Rectangle.read(arguments),\n\t\t\tepsilon = Base.read(arguments) || 0;\n\t\treturn rect.x + rect.width > this.x - epsilon\n\t\t\t\t&& rect.y + rect.height > this.y - epsilon\n\t\t\t\t&& rect.x < this.x + this.width + epsilon\n\t\t\t\t&& rect.y < this.y + this.height + epsilon;\n\t},\n\n\tintersect: function() {\n\t\tvar rect = Rectangle.read(arguments),\n\t\t\tx1 = Math.max(this.x, rect.x),\n\t\t\ty1 = Math.max(this.y, rect.y),\n\t\t\tx2 = Math.min(this.x + this.width, rect.x + rect.width),\n\t\t\ty2 = Math.min(this.y + this.height, rect.y + rect.height);\n\t\treturn new Rectangle(x1, y1, x2 - x1, y2 - y1);\n\t},\n\n\tunite: function() {\n\t\tvar rect = Rectangle.read(arguments),\n\t\t\tx1 = Math.min(this.x, rect.x),\n\t\t\ty1 = Math.min(this.y, rect.y),\n\t\t\tx2 = Math.max(this.x + this.width, rect.x + rect.width),\n\t\t\ty2 = Math.max(this.y + this.height, rect.y + rect.height);\n\t\treturn new Rectangle(x1, y1, x2 - x1, y2 - y1);\n\t},\n\n\tinclude: function() {\n\t\tvar point = Point.read(arguments);\n\t\tvar x1 = Math.min(this.x, point.x),\n\t\t\ty1 = Math.min(this.y, point.y),\n\t\t\tx2 = Math.max(this.x + this.width, point.x),\n\t\t\ty2 = Math.max(this.y + this.height, point.y);\n\t\treturn new Rectangle(x1, y1, x2 - x1, y2 - y1);\n\t},\n\n\texpand: function() {\n\t\tvar amount = Size.read(arguments),\n\t\t\thor = amount.width,\n\t\t\tver = amount.height;\n\t\treturn new Rectangle(this.x - hor / 2, this.y - ver / 2,\n\t\t\t\tthis.width + hor, this.height + ver);\n\t},\n\n\tscale: function(hor, ver) {\n\t\treturn this.expand(this.width * hor - this.width,\n\t\t\t\tthis.height * (ver === undefined ? hor : ver) - this.height);\n\t}\n}, Base.each([\n\t\t['Top', 'Left'], ['Top', 'Right'],\n\t\t['Bottom', 'Left'], ['Bottom', 'Right'],\n\t\t['Left', 'Center'], ['Top', 'Center'],\n\t\t['Right', 'Center'], ['Bottom', 'Center']\n\t],\n\tfunction(parts, index) {\n\t\tvar part = parts.join(''),\n\t\t\txFirst = /^[RL]/.test(part);\n\t\tif (index >= 4)\n\t\t\tparts[1] += xFirst ? 'Y' : 'X';\n\t\tvar x = parts[xFirst ? 0 : 1],\n\t\t\ty = parts[xFirst ? 1 : 0],\n\t\t\tgetX = 'get' + x,\n\t\t\tgetY = 'get' + y,\n\t\t\tsetX = 'set' + x,\n\t\t\tsetY = 'set' + y,\n\t\t\tget = 'get' + part,\n\t\t\tset = 'set' + part;\n\t\tthis[get] = function(_dontLink) {\n\t\t\tvar ctor = _dontLink ? Point : LinkedPoint;\n\t\t\treturn new ctor(this[getX](), this[getY](), this, set);\n\t\t};\n\t\tthis[set] = function() {\n\t\t\tvar point = Point.read(arguments);\n\t\t\tthis[setX](point.x);\n\t\t\tthis[setY](point.y);\n\t\t};\n\t}, {\n\t\tbeans: true\n\t}\n));\n\nvar LinkedRectangle = Rectangle.extend({\n\tinitialize: function Rectangle(x, y, width, height, owner, setter) {\n\t\tthis._set(x, y, width, height, true);\n\t\tthis._owner = owner;\n\t\tthis._setter = setter;\n\t},\n\n\t_set: function(x, y, width, height, _dontNotify) {\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._width = width;\n\t\tthis._height = height;\n\t\tif (!_dontNotify)\n\t\t\tthis._owner[this._setter](this);\n\t\treturn this;\n\t}\n},\nnew function() {\n\tvar proto = Rectangle.prototype;\n\n\treturn Base.each(['x', 'y', 'width', 'height'], function(key) {\n\t\tvar part = Base.capitalize(key),\n\t\t\tinternal = '_' + key;\n\t\tthis['get' + part] = function() {\n\t\t\treturn this[internal];\n\t\t};\n\n\t\tthis['set' + part] = function(value) {\n\t\t\tthis[internal] = value;\n\t\t\tif (!this._dontNotify)\n\t\t\t\tthis._owner[this._setter](this);\n\t\t};\n\t}, Base.each(['Point', 'Size', 'Center',\n\t\t\t'Left', 'Top', 'Right', 'Bottom', 'CenterX', 'CenterY',\n\t\t\t'TopLeft', 'TopRight', 'BottomLeft', 'BottomRight',\n\t\t\t'LeftCenter', 'TopCenter', 'RightCenter', 'BottomCenter'],\n\t\tfunction(key) {\n\t\t\tvar name = 'set' + key;\n\t\t\tthis[name] = function() {\n\t\t\t\tthis._dontNotify = true;\n\t\t\t\tproto[name].apply(this, arguments);\n\t\t\t\tthis._dontNotify = false;\n\t\t\t\tthis._owner[this._setter](this);\n\t\t\t};\n\t\t}, {\n\t\t\tisSelected: function() {\n\t\t\t\treturn !!(this._owner._selection & 2);\n\t\t\t},\n\n\t\t\tsetSelected: function(selected) {\n\t\t\t\tvar owner = this._owner;\n\t\t\t\tif (owner._changeSelection) {\n\t\t\t\t\towner._changeSelection(2, selected);\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t);\n});\n\nvar Matrix = Base.extend({\n\t_class: 'Matrix',\n\n\tinitialize: function Matrix(arg, _dontNotify) {\n\t\tvar args = arguments,\n\t\t\tcount = args.length,\n\t\t\tok = true;\n\t\tif (count >= 6) {\n\t\t\tthis._set.apply(this, args);\n\t\t} else if (count === 1 || count === 2) {\n\t\t\tif (arg instanceof Matrix) {\n\t\t\t\tthis._set(arg._a, arg._b, arg._c, arg._d, arg._tx, arg._ty,\n\t\t\t\t\t\t_dontNotify);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tthis._set.apply(this,\n\t\t\t\t\t\t_dontNotify ? arg.concat([_dontNotify]) : arg);\n\t\t\t} else {\n\t\t\t\tok = false;\n\t\t\t}\n\t\t} else if (!count) {\n\t\t\tthis.reset();\n\t\t} else {\n\t\t\tok = false;\n\t\t}\n\t\tif (!ok) {\n\t\t\tthrow new Error('Unsupported matrix parameters');\n\t\t}\n\t\treturn this;\n\t},\n\n\tset: '#initialize',\n\n\t_set: function(a, b, c, d, tx, ty, _dontNotify) {\n\t\tthis._a = a;\n\t\tthis._b = b;\n\t\tthis._c = c;\n\t\tthis._d = d;\n\t\tthis._tx = tx;\n\t\tthis._ty = ty;\n\t\tif (!_dontNotify)\n\t\t\tthis._changed();\n\t\treturn this;\n\t},\n\n\t_serialize: function(options, dictionary) {\n\t\treturn Base.serialize(this.getValues(), options, true, dictionary);\n\t},\n\n\t_changed: function() {\n\t\tvar owner = this._owner;\n\t\tif (owner) {\n\t\t\tif (owner._applyMatrix) {\n\t\t\t\towner.transform(null, true);\n\t\t\t} else {\n\t\t\t\towner._changed(25);\n\t\t\t}\n\t\t}\n\t},\n\n\tclone: function() {\n\t\treturn new Matrix(this._a, this._b, this._c, this._d,\n\t\t\t\tthis._tx, this._ty);\n\t},\n\n\tequals: function(mx) {\n\t\treturn mx === this || mx && this._a === mx._a && this._b === mx._b\n\t\t\t\t&& this._c === mx._c && this._d === mx._d\n\t\t\t\t&& this._tx === mx._tx && this._ty === mx._ty;\n\t},\n\n\ttoString: function() {\n\t\tvar f = Formatter.instance;\n\t\treturn '[[' + [f.number(this._a), f.number(this._c),\n\t\t\t\t\tf.number(this._tx)].join(', ') + '], ['\n\t\t\t\t+ [f.number(this._b), f.number(this._d),\n\t\t\t\t\tf.number(this._ty)].join(', ') + ']]';\n\t},\n\n\treset: function(_dontNotify) {\n\t\tthis._a = this._d = 1;\n\t\tthis._b = this._c = this._tx = this._ty = 0;\n\t\tif (!_dontNotify)\n\t\t\tthis._changed();\n\t\treturn this;\n\t},\n\n\tapply: function(recursively, _setApplyMatrix) {\n\t\tvar owner = this._owner;\n\t\tif (owner) {\n\t\t\towner.transform(null, Base.pick(recursively, true), _setApplyMatrix);\n\t\t\treturn this.isIdentity();\n\t\t}\n\t\treturn false;\n\t},\n\n\ttranslate: function() {\n\t\tvar point = Point.read(arguments),\n\t\t\tx = point.x,\n\t\t\ty = point.y;\n\t\tthis._tx += x * this._a + y * this._c;\n\t\tthis._ty += x * this._b + y * this._d;\n\t\tthis._changed();\n\t\treturn this;\n\t},\n\n\tscale: function() {\n\t\tvar args = arguments,\n\t\t\tscale = Point.read(args),\n\t\t\tcenter = Point.read(args, 0, { readNull: true });\n\t\tif (center)\n\t\t\tthis.translate(center);\n\t\tthis._a *= scale.x;\n\t\tthis._b *= scale.x;\n\t\tthis._c *= scale.y;\n\t\tthis._d *= scale.y;\n\t\tif (center)\n\t\t\tthis.translate(center.negate());\n\t\tthis._changed();\n\t\treturn this;\n\t},\n\n\trotate: function(angle ) {\n\t\tangle *= Math.PI / 180;\n\t\tvar center = Point.read(arguments, 1),\n\t\t\tx = center.x,\n\t\t\ty = center.y,\n\t\t\tcos = Math.cos(angle),\n\t\t\tsin = Math.sin(angle),\n\t\t\ttx = x - x * cos + y * sin,\n\t\t\tty = y - x * sin - y * cos,\n\t\t\ta = this._a,\n\t\t\tb = this._b,\n\t\t\tc = this._c,\n\t\t\td = this._d;\n\t\tthis._a = cos * a + sin * c;\n\t\tthis._b = cos * b + sin * d;\n\t\tthis._c = -sin * a + cos * c;\n\t\tthis._d = -sin * b + cos * d;\n\t\tthis._tx += tx * a + ty * c;\n\t\tthis._ty += tx * b + ty * d;\n\t\tthis._changed();\n\t\treturn this;\n\t},\n\n\tshear: function() {\n\t\tvar args = arguments,\n\t\t\tshear = Point.read(args),\n\t\t\tcenter = Point.read(args, 0, { readNull: true });\n\t\tif (center)\n\t\t\tthis.translate(center);\n\t\tvar a = this._a,\n\t\t\tb = this._b;\n\t\tthis._a += shear.y * this._c;\n\t\tthis._b += shear.y * this._d;\n\t\tthis._c += shear.x * a;\n\t\tthis._d += shear.x * b;\n\t\tif (center)\n\t\t\tthis.translate(center.negate());\n\t\tthis._changed();\n\t\treturn this;\n\t},\n\n\tskew: function() {\n\t\tvar args = arguments,\n\t\t\tskew = Point.read(args),\n\t\t\tcenter = Point.read(args, 0, { readNull: true }),\n\t\t\ttoRadians = Math.PI / 180,\n\t\t\tshear = new Point(Math.tan(skew.x * toRadians),\n\t\t\t\tMath.tan(skew.y * toRadians));\n\t\treturn this.shear(shear, center);\n\t},\n\n\tappend: function(mx, _dontNotify) {\n\t\tif (mx) {\n\t\t\tvar a1 = this._a,\n\t\t\t\tb1 = this._b,\n\t\t\t\tc1 = this._c,\n\t\t\t\td1 = this._d,\n\t\t\t\ta2 = mx._a,\n\t\t\t\tb2 = mx._c,\n\t\t\t\tc2 = mx._b,\n\t\t\t\td2 = mx._d,\n\t\t\t\ttx2 = mx._tx,\n\t\t\t\tty2 = mx._ty;\n\t\t\tthis._a = a2 * a1 + c2 * c1;\n\t\t\tthis._c = b2 * a1 + d2 * c1;\n\t\t\tthis._b = a2 * b1 + c2 * d1;\n\t\t\tthis._d = b2 * b1 + d2 * d1;\n\t\t\tthis._tx += tx2 * a1 + ty2 * c1;\n\t\t\tthis._ty += tx2 * b1 + ty2 * d1;\n\t\t\tif (!_dontNotify)\n\t\t\t\tthis._changed();\n\t\t}\n\t\treturn this;\n\t},\n\n\tprepend: function(mx, _dontNotify) {\n\t\tif (mx) {\n\t\t\tvar a1 = this._a,\n\t\t\t\tb1 = this._b,\n\t\t\t\tc1 = this._c,\n\t\t\t\td1 = this._d,\n\t\t\t\ttx1 = this._tx,\n\t\t\t\tty1 = this._ty,\n\t\t\t\ta2 = mx._a,\n\t\t\t\tb2 = mx._c,\n\t\t\t\tc2 = mx._b,\n\t\t\t\td2 = mx._d,\n\t\t\t\ttx2 = mx._tx,\n\t\t\t\tty2 = mx._ty;\n\t\t\tthis._a = a2 * a1 + b2 * b1;\n\t\t\tthis._c = a2 * c1 + b2 * d1;\n\t\t\tthis._b = c2 * a1 + d2 * b1;\n\t\t\tthis._d = c2 * c1 + d2 * d1;\n\t\t\tthis._tx = a2 * tx1 + b2 * ty1 + tx2;\n\t\t\tthis._ty = c2 * tx1 + d2 * ty1 + ty2;\n\t\t\tif (!_dontNotify)\n\t\t\t\tthis._changed();\n\t\t}\n\t\treturn this;\n\t},\n\n\tappended: function(mx) {\n\t\treturn this.clone().append(mx);\n\t},\n\n\tprepended: function(mx) {\n\t\treturn this.clone().prepend(mx);\n\t},\n\n\tinvert: function() {\n\t\tvar a = this._a,\n\t\t\tb = this._b,\n\t\t\tc = this._c,\n\t\t\td = this._d,\n\t\t\ttx = this._tx,\n\t\t\tty = this._ty,\n\t\t\tdet = a * d - b * c,\n\t\t\tres = null;\n\t\tif (det && !isNaN(det) && isFinite(tx) && isFinite(ty)) {\n\t\t\tthis._a = d / det;\n\t\t\tthis._b = -b / det;\n\t\t\tthis._c = -c / det;\n\t\t\tthis._d = a / det;\n\t\t\tthis._tx = (c * ty - d * tx) / det;\n\t\t\tthis._ty = (b * tx - a * ty) / det;\n\t\t\tres = this;\n\t\t}\n\t\treturn res;\n\t},\n\n\tinverted: function() {\n\t\treturn this.clone().invert();\n\t},\n\n\tconcatenate: '#append',\n\tpreConcatenate: '#prepend',\n\tchain: '#appended',\n\n\t_shiftless: function() {\n\t\treturn new Matrix(this._a, this._b, this._c, this._d, 0, 0);\n\t},\n\n\t_orNullIfIdentity: function() {\n\t\treturn this.isIdentity() ? null : this;\n\t},\n\n\tisIdentity: function() {\n\t\treturn this._a === 1 && this._b === 0 && this._c === 0 && this._d === 1\n\t\t\t\t&& this._tx === 0 && this._ty === 0;\n\t},\n\n\tisInvertible: function() {\n\t\tvar det = this._a * this._d - this._c * this._b;\n\t\treturn det && !isNaN(det) && isFinite(this._tx) && isFinite(this._ty);\n\t},\n\n\tisSingular: function() {\n\t\treturn !this.isInvertible();\n\t},\n\n\ttransform: function( src, dst, count) {\n\t\treturn arguments.length < 3\n\t\t\t? this._transformPoint(Point.read(arguments))\n\t\t\t: this._transformCoordinates(src, dst, count);\n\t},\n\n\t_transformPoint: function(point, dest, _dontNotify) {\n\t\tvar x = point.x,\n\t\t\ty = point.y;\n\t\tif (!dest)\n\t\t\tdest = new Point();\n\t\treturn dest._set(\n\t\t\t\tx * this._a + y * this._c + this._tx,\n\t\t\t\tx * this._b + y * this._d + this._ty,\n\t\t\t\t_dontNotify);\n\t},\n\n\t_transformCoordinates: function(src, dst, count) {\n\t\tfor (var i = 0, max = 2 * count; i < max; i += 2) {\n\t\t\tvar x = src[i],\n\t\t\t\ty = src[i + 1];\n\t\t\tdst[i] = x * this._a + y * this._c + this._tx;\n\t\t\tdst[i + 1] = x * this._b + y * this._d + this._ty;\n\t\t}\n\t\treturn dst;\n\t},\n\n\t_transformCorners: function(rect) {\n\t\tvar x1 = rect.x,\n\t\t\ty1 = rect.y,\n\t\t\tx2 = x1 + rect.width,\n\t\t\ty2 = y1 + rect.height,\n\t\t\tcoords = [ x1, y1, x2, y1, x2, y2, x1, y2 ];\n\t\treturn this._transformCoordinates(coords, coords, 4);\n\t},\n\n\t_transformBounds: function(bounds, dest, _dontNotify) {\n\t\tvar coords = this._transformCorners(bounds),\n\t\t\tmin = coords.slice(0, 2),\n\t\t\tmax = min.slice();\n\t\tfor (var i = 2; i < 8; i++) {\n\t\t\tvar val = coords[i],\n\t\t\t\tj = i & 1;\n\t\t\tif (val < min[j]) {\n\t\t\t\tmin[j] = val;\n\t\t\t} else if (val > max[j]) {\n\t\t\t\tmax[j] = val;\n\t\t\t}\n\t\t}\n\t\tif (!dest)\n\t\t\tdest = new Rectangle();\n\t\treturn dest._set(min[0], min[1], max[0] - min[0], max[1] - min[1],\n\t\t\t\t_dontNotify);\n\t},\n\n\tinverseTransform: function() {\n\t\treturn this._inverseTransform(Point.read(arguments));\n\t},\n\n\t_inverseTransform: function(point, dest, _dontNotify) {\n\t\tvar a = this._a,\n\t\t\tb = this._b,\n\t\t\tc = this._c,\n\t\t\td = this._d,\n\t\t\ttx = this._tx,\n\t\t\tty = this._ty,\n\t\t\tdet = a * d - b * c,\n\t\t\tres = null;\n\t\tif (det && !isNaN(det) && isFinite(tx) && isFinite(ty)) {\n\t\t\tvar x = point.x - this._tx,\n\t\t\t\ty = point.y - this._ty;\n\t\t\tif (!dest)\n\t\t\t\tdest = new Point();\n\t\t\tres = dest._set(\n\t\t\t\t\t(x * d - y * c) / det,\n\t\t\t\t\t(y * a - x * b) / det,\n\t\t\t\t\t_dontNotify);\n\t\t}\n\t\treturn res;\n\t},\n\n\tdecompose: function() {\n\t\tvar a = this._a,\n\t\t\tb = this._b,\n\t\t\tc = this._c,\n\t\t\td = this._d,\n\t\t\tdet = a * d - b * c,\n\t\t\tsqrt = Math.sqrt,\n\t\t\tatan2 = Math.atan2,\n\t\t\tdegrees = 180 / Math.PI,\n\t\t\trotate,\n\t\t\tscale,\n\t\t\tskew;\n\t\tif (a !== 0 || b !== 0) {\n\t\t\tvar r = sqrt(a * a + b * b);\n\t\t\trotate = Math.acos(a / r) * (b > 0 ? 1 : -1);\n\t\t\tscale = [r, det / r];\n\t\t\tskew = [atan2(a * c + b * d, r * r), 0];\n\t\t} else if (c !== 0 || d !== 0) {\n\t\t\tvar s = sqrt(c * c + d * d);\n\t\t\trotate = Math.asin(c / s) * (d > 0 ? 1 : -1);\n\t\t\tscale = [det / s, s];\n\t\t\tskew = [0, atan2(a * c + b * d, s * s)];\n\t\t} else {\n\t\t\trotate = 0;\n\t\t\tskew = scale = [0, 0];\n\t\t}\n\t\treturn {\n\t\t\ttranslation: this.getTranslation(),\n\t\t\trotation: rotate * degrees,\n\t\t\tscaling: new Point(scale),\n\t\t\tskewing: new Point(skew[0] * degrees, skew[1] * degrees)\n\t\t};\n\t},\n\n\tgetValues: function() {\n\t\treturn [ this._a, this._b, this._c, this._d, this._tx, this._ty ];\n\t},\n\n\tgetTranslation: function() {\n\t\treturn new Point(this._tx, this._ty);\n\t},\n\n\tgetScaling: function() {\n\t\treturn this.decompose().scaling;\n\t},\n\n\tgetRotation: function() {\n\t\treturn this.decompose().rotation;\n\t},\n\n\tapplyToContext: function(ctx) {\n\t\tif (!this.isIdentity()) {\n\t\t\tctx.transform(this._a, this._b, this._c, this._d,\n\t\t\t\t\tthis._tx, this._ty);\n\t\t}\n\t}\n}, Base.each(['a', 'b', 'c', 'd', 'tx', 'ty'], function(key) {\n\tvar part = Base.capitalize(key),\n\t\tprop = '_' + key;\n\tthis['get' + part] = function() {\n\t\treturn this[prop];\n\t};\n\tthis['set' + part] = function(value) {\n\t\tthis[prop] = value;\n\t\tthis._changed();\n\t};\n}, {}));\n\nvar Line = Base.extend({\n\t_class: 'Line',\n\n\tinitialize: function Line(arg0, arg1, arg2, arg3, arg4) {\n\t\tvar asVector = false;\n\t\tif (arguments.length >= 4) {\n\t\t\tthis._px = arg0;\n\t\t\tthis._py = arg1;\n\t\t\tthis._vx = arg2;\n\t\t\tthis._vy = arg3;\n\t\t\tasVector = arg4;\n\t\t} else {\n\t\t\tthis._px = arg0.x;\n\t\t\tthis._py = arg0.y;\n\t\t\tthis._vx = arg1.x;\n\t\t\tthis._vy = arg1.y;\n\t\t\tasVector = arg2;\n\t\t}\n\t\tif (!asVector) {\n\t\t\tthis._vx -= this._px;\n\t\t\tthis._vy -= this._py;\n\t\t}\n\t},\n\n\tgetPoint: function() {\n\t\treturn new Point(this._px, this._py);\n\t},\n\n\tgetVector: function() {\n\t\treturn new Point(this._vx, this._vy);\n\t},\n\n\tgetLength: function() {\n\t\treturn this.getVector().getLength();\n\t},\n\n\tintersect: function(line, isInfinite) {\n\t\treturn Line.intersect(\n\t\t\t\tthis._px, this._py, this._vx, this._vy,\n\t\t\t\tline._px, line._py, line._vx, line._vy,\n\t\t\t\ttrue, isInfinite);\n\t},\n\n\tgetSide: function(point, isInfinite) {\n\t\treturn Line.getSide(\n\t\t\t\tthis._px, this._py, this._vx, this._vy,\n\t\t\t\tpoint.x, point.y, true, isInfinite);\n\t},\n\n\tgetDistance: function(point) {\n\t\treturn Math.abs(this.getSignedDistance(point));\n\t},\n\n\tgetSignedDistance: function(point) {\n\t\treturn Line.getSignedDistance(this._px, this._py, this._vx, this._vy,\n\t\t\t\tpoint.x, point.y, true);\n\t},\n\n\tisCollinear: function(line) {\n\t\treturn Point.isCollinear(this._vx, this._vy, line._vx, line._vy);\n\t},\n\n\tisOrthogonal: function(line) {\n\t\treturn Point.isOrthogonal(this._vx, this._vy, line._vx, line._vy);\n\t},\n\n\tstatics: {\n\t\tintersect: function(p1x, p1y, v1x, v1y, p2x, p2y, v2x, v2y, asVector,\n\t\t\t\tisInfinite) {\n\t\t\tif (!asVector) {\n\t\t\t\tv1x -= p1x;\n\t\t\t\tv1y -= p1y;\n\t\t\t\tv2x -= p2x;\n\t\t\t\tv2y -= p2y;\n\t\t\t}\n\t\t\tvar cross = v1x * v2y - v1y * v2x;\n\t\t\tif (!Numerical.isMachineZero(cross)) {\n\t\t\t\tvar dx = p1x - p2x,\n\t\t\t\t\tdy = p1y - p2y,\n\t\t\t\t\tu1 = (v2x * dy - v2y * dx) / cross,\n\t\t\t\t\tu2 = (v1x * dy - v1y * dx) / cross,\n\t\t\t\t\tepsilon = 1e-12,\n\t\t\t\t\tuMin = -epsilon,\n\t\t\t\t\tuMax = 1 + epsilon;\n\t\t\t\tif (isInfinite\n\t\t\t\t\t\t|| uMin < u1 && u1 < uMax && uMin < u2 && u2 < uMax) {\n\t\t\t\t\tif (!isInfinite) {\n\t\t\t\t\t\tu1 = u1 <= 0 ? 0 : u1 >= 1 ? 1 : u1;\n\t\t\t\t\t}\n\t\t\t\t\treturn new Point(\n\t\t\t\t\t\t\tp1x + u1 * v1x,\n\t\t\t\t\t\t\tp1y + u1 * v1y);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tgetSide: function(px, py, vx, vy, x, y, asVector, isInfinite) {\n\t\t\tif (!asVector) {\n\t\t\t\tvx -= px;\n\t\t\t\tvy -= py;\n\t\t\t}\n\t\t\tvar v2x = x - px,\n\t\t\t\tv2y = y - py,\n\t\t\t\tccw = v2x * vy - v2y * vx;\n\t\t\tif (!isInfinite && Numerical.isMachineZero(ccw)) {\n\t\t\t\tccw = (v2x * vx + v2x * vx) / (vx * vx + vy * vy);\n\t\t\t\tif (ccw >= 0 && ccw <= 1)\n\t\t\t\t\tccw = 0;\n\t\t\t}\n\t\t\treturn ccw < 0 ? -1 : ccw > 0 ? 1 : 0;\n\t\t},\n\n\t\tgetSignedDistance: function(px, py, vx, vy, x, y, asVector) {\n\t\t\tif (!asVector) {\n\t\t\t\tvx -= px;\n\t\t\t\tvy -= py;\n\t\t\t}\n\t\t\t return vx === 0 ? (vy > 0 ? x - px : px - x)\n\t\t\t\t\t: vy === 0 ? (vx < 0 ? y - py : py - y)\n\t\t\t\t\t: ((x - px) * vy - (y - py) * vx) / (\n\t\t\t\t\t\tvy > vx\n\t\t\t\t\t\t\t? vy * Math.sqrt(1 + (vx * vx) / (vy * vy))\n\t\t\t\t\t\t\t: vx * Math.sqrt(1 + (vy * vy) / (vx * vx))\n\t\t\t\t\t);\n\t\t},\n\n\t\tgetDistance: function(px, py, vx, vy, x, y, asVector) {\n\t\t\treturn Math.abs(\n\t\t\t\t\tLine.getSignedDistance(px, py, vx, vy, x, y, asVector));\n\t\t}\n\t}\n});\n\nvar Project = PaperScopeItem.extend({\n\t_class: 'Project',\n\t_list: 'projects',\n\t_reference: 'project',\n\t_compactSerialize: true,\n\n\tinitialize: function Project(element) {\n\t\tPaperScopeItem.call(this, true);\n\t\tthis._children = [];\n\t\tthis._namedChildren = {};\n\t\tthis._activeLayer = null;\n\t\tthis._currentStyle = new Style(null, null, this);\n\t\tthis._view = View.create(this,\n\t\t\t\telement || CanvasProvider.getCanvas(1, 1));\n\t\tthis._selectionItems = {};\n\t\tthis._selectionCount = 0;\n\t\tthis._updateVersion = 0;\n\t},\n\n\t_serialize: function(options, dictionary) {\n\t\treturn Base.serialize(this._children, options, true, dictionary);\n\t},\n\n\t_changed: function(flags, item) {\n\t\tif (flags & 1) {\n\t\t\tvar view = this._view;\n\t\t\tif (view) {\n\t\t\t\tview._needsUpdate = true;\n\t\t\t\tif (!view._requested && view._autoUpdate)\n\t\t\t\t\tview.requestUpdate();\n\t\t\t}\n\t\t}\n\t\tvar changes = this._changes;\n\t\tif (changes && item) {\n\t\t\tvar changesById = this._changesById,\n\t\t\t\tid = item._id,\n\t\t\t\tentry = changesById[id];\n\t\t\tif (entry) {\n\t\t\t\tentry.flags |= flags;\n\t\t\t} else {\n\t\t\t\tchanges.push(changesById[id] = { item: item, flags: flags });\n\t\t\t}\n\t\t}\n\t},\n\n\tclear: function() {\n\t\tvar children = this._children;\n\t\tfor (var i = children.length - 1; i >= 0; i--)\n\t\t\tchildren[i].remove();\n\t},\n\n\tisEmpty: function() {\n\t\treturn !this._children.length;\n\t},\n\n\tremove: function remove() {\n\t\tif (!remove.base.call(this))\n\t\t\treturn false;\n\t\tif (this._view)\n\t\t\tthis._view.remove();\n\t\treturn true;\n\t},\n\n\tgetView: function() {\n\t\treturn this._view;\n\t},\n\n\tgetCurrentStyle: function() {\n\t\treturn this._currentStyle;\n\t},\n\n\tsetCurrentStyle: function(style) {\n\t\tthis._currentStyle.set(style);\n\t},\n\n\tgetIndex: function() {\n\t\treturn this._index;\n\t},\n\n\tgetOptions: function() {\n\t\treturn this._scope.settings;\n\t},\n\n\tgetLayers: function() {\n\t\treturn this._children;\n\t},\n\n\tgetActiveLayer: function() {\n\t\treturn this._activeLayer || new Layer({ project: this, insert: true });\n\t},\n\n\tgetSymbolDefinitions: function() {\n\t\tvar definitions = [],\n\t\t\tids = {};\n\t\tthis.getItems({\n\t\t\tclass: SymbolItem,\n\t\t\tmatch: function(item) {\n\t\t\t\tvar definition = item._definition,\n\t\t\t\t\tid = definition._id;\n\t\t\t\tif (!ids[id]) {\n\t\t\t\t\tids[id] = true;\n\t\t\t\t\tdefinitions.push(definition);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\treturn definitions;\n\t},\n\n\tgetSymbols: 'getSymbolDefinitions',\n\n\tgetSelectedItems: function() {\n\t\tvar selectionItems = this._selectionItems,\n\t\t\titems = [];\n\t\tfor (var id in selectionItems) {\n\t\t\tvar item = selectionItems[id],\n\t\t\t\tselection = item._selection;\n\t\t\tif ((selection & 1) && item.isInserted()) {\n\t\t\t\titems.push(item);\n\t\t\t} else if (!selection) {\n\t\t\t\tthis._updateSelection(item);\n\t\t\t}\n\t\t}\n\t\treturn items;\n\t},\n\n\t_updateSelection: function(item) {\n\t\tvar id = item._id,\n\t\t\tselectionItems = this._selectionItems;\n\t\tif (item._selection) {\n\t\t\tif (selectionItems[id] !== item) {\n\t\t\t\tthis._selectionCount++;\n\t\t\t\tselectionItems[id] = item;\n\t\t\t}\n\t\t} else if (selectionItems[id] === item) {\n\t\t\tthis._selectionCount--;\n\t\t\tdelete selectionItems[id];\n\t\t}\n\t},\n\n\tselectAll: function() {\n\t\tvar children = this._children;\n\t\tfor (var i = 0, l = children.length; i < l; i++)\n\t\t\tchildren[i].setFullySelected(true);\n\t},\n\n\tdeselectAll: function() {\n\t\tvar selectionItems = this._selectionItems;\n\t\tfor (var i in selectionItems)\n\t\t\tselectionItems[i].setFullySelected(false);\n\t},\n\n\taddLayer: function(layer) {\n\t\treturn this.insertLayer(undefined, layer);\n\t},\n\n\tinsertLayer: function(index, layer) {\n\t\tif (layer instanceof Layer) {\n\t\t\tlayer._remove(false, true);\n\t\t\tBase.splice(this._children, [layer], index, 0);\n\t\t\tlayer._setProject(this, true);\n\t\t\tvar name = layer._name;\n\t\t\tif (name)\n\t\t\t\tlayer.setName(name);\n\t\t\tif (this._changes)\n\t\t\t\tlayer._changed(5);\n\t\t\tif (!this._activeLayer)\n\t\t\t\tthis._activeLayer = layer;\n\t\t} else {\n\t\t\tlayer = null;\n\t\t}\n\t\treturn layer;\n\t},\n\n\t_insertItem: function(index, item, _created) {\n\t\titem = this.insertLayer(index, item)\n\t\t\t\t|| (this._activeLayer || this._insertItem(undefined,\n\t\t\t\t\t\tnew Layer(Item.NO_INSERT), true))\n\t\t\t\t\t\t.insertChild(index, item);\n\t\tif (_created && item.activate)\n\t\t\titem.activate();\n\t\treturn item;\n\t},\n\n\tgetItems: function(options) {\n\t\treturn Item._getItems(this, options);\n\t},\n\n\tgetItem: function(options) {\n\t\treturn Item._getItems(this, options, null, null, true)[0] || null;\n\t},\n\n\timportJSON: function(json) {\n\t\tthis.activate();\n\t\tvar layer = this._activeLayer;\n\t\treturn Base.importJSON(json, layer && layer.isEmpty() && layer);\n\t},\n\n\tremoveOn: function(type) {\n\t\tvar sets = this._removeSets;\n\t\tif (sets) {\n\t\t\tif (type === 'mouseup')\n\t\t\t\tsets.mousedrag = null;\n\t\t\tvar set = sets[type];\n\t\t\tif (set) {\n\t\t\t\tfor (var id in set) {\n\t\t\t\t\tvar item = set[id];\n\t\t\t\t\tfor (var key in sets) {\n\t\t\t\t\t\tvar other = sets[key];\n\t\t\t\t\t\tif (other && other != set)\n\t\t\t\t\t\t\tdelete other[item._id];\n\t\t\t\t\t}\n\t\t\t\t\titem.remove();\n\t\t\t\t}\n\t\t\t\tsets[type] = null;\n\t\t\t}\n\t\t}\n\t},\n\n\tdraw: function(ctx, matrix, pixelRatio) {\n\t\tthis._updateVersion++;\n\t\tctx.save();\n\t\tmatrix.applyToContext(ctx);\n\t\tvar children = this._children,\n\t\t\tparam = new Base({\n\t\t\t\toffset: new Point(0, 0),\n\t\t\t\tpixelRatio: pixelRatio,\n\t\t\t\tviewMatrix: matrix.isIdentity() ? null : matrix,\n\t\t\t\tmatrices: [new Matrix()],\n\t\t\t\tupdateMatrix: true\n\t\t\t});\n\t\tfor (var i = 0, l = children.length; i < l; i++) {\n\t\t\tchildren[i].draw(ctx, param);\n\t\t}\n\t\tctx.restore();\n\n\t\tif (this._selectionCount > 0) {\n\t\t\tctx.save();\n\t\t\tctx.strokeWidth = 1;\n\t\t\tvar items = this._selectionItems,\n\t\t\t\tsize = this._scope.settings.handleSize,\n\t\t\t\tversion = this._updateVersion;\n\t\t\tfor (var id in items) {\n\t\t\t\titems[id]._drawSelection(ctx, matrix, size, items, version);\n\t\t\t}\n\t\t\tctx.restore();\n\t\t}\n\t}\n});\n\nvar Item = Base.extend(Emitter, {\n\tstatics: {\n\t\textend: function extend(src) {\n\t\t\tif (src._serializeFields)\n\t\t\t\tsrc._serializeFields = Base.set({},\n\t\t\t\t\tthis.prototype._serializeFields, src._serializeFields);\n\t\t\treturn extend.base.apply(this, arguments);\n\t\t},\n\n\t\tINSERT: { insert: true },\n\t\tNO_INSERT: { insert: false }\n\t},\n\n\t_class: 'Item',\n\t_name: null,\n\t_applyMatrix: true,\n\t_canApplyMatrix: true,\n\t_canScaleStroke: false,\n\t_pivot: null,\n\t_visible: true,\n\t_blendMode: 'normal',\n\t_opacity: 1,\n\t_locked: false,\n\t_guide: false,\n\t_clipMask: false,\n\t_selection: 0,\n\t_selectBounds: true,\n\t_selectChildren: false,\n\t_serializeFields: {\n\t\tname: null,\n\t\tapplyMatrix: null,\n\t\tmatrix: new Matrix(),\n\t\tpivot: null,\n\t\tvisible: true,\n\t\tblendMode: 'normal',\n\t\topacity: 1,\n\t\tlocked: false,\n\t\tguide: false,\n\t\tclipMask: false,\n\t\tselected: false,\n\t\tdata: {}\n\t},\n\t_prioritize: ['applyMatrix']\n},\nnew function() {\n\tvar handlers = ['onMouseDown', 'onMouseUp', 'onMouseDrag', 'onClick',\n\t\t\t'onDoubleClick', 'onMouseMove', 'onMouseEnter', 'onMouseLeave'];\n\treturn Base.each(handlers,\n\t\tfunction(name) {\n\t\t\tthis._events[name] = {\n\t\t\t\tinstall: function(type) {\n\t\t\t\t\tthis.getView()._countItemEvent(type, 1);\n\t\t\t\t},\n\n\t\t\t\tuninstall: function(type) {\n\t\t\t\t\tthis.getView()._countItemEvent(type, -1);\n\t\t\t\t}\n\t\t\t};\n\t\t}, {\n\t\t\t_events: {\n\t\t\t\tonFrame: {\n\t\t\t\t\tinstall: function() {\n\t\t\t\t\t\tthis.getView()._animateItem(this, true);\n\t\t\t\t\t},\n\n\t\t\t\t\tuninstall: function() {\n\t\t\t\t\t\tthis.getView()._animateItem(this, false);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tonLoad: {},\n\t\t\t\tonError: {}\n\t\t\t},\n\t\t\tstatics: {\n\t\t\t\t_itemHandlers: handlers\n\t\t\t}\n\t\t}\n\t);\n}, {\n\tinitialize: function Item() {\n\t},\n\n\t_initialize: function(props, point) {\n\t\tvar hasProps = props && Base.isPlainObject(props),\n\t\t\tinternal = hasProps && props.internal === true,\n\t\t\tmatrix = this._matrix = new Matrix(),\n\t\t\tproject = hasProps && props.project || paper.project,\n\t\t\tsettings = paper.settings;\n\t\tthis._id = internal ? null : UID.get();\n\t\tthis._parent = this._index = null;\n\t\tthis._applyMatrix = this._canApplyMatrix && settings.applyMatrix;\n\t\tif (point)\n\t\t\tmatrix.translate(point);\n\t\tmatrix._owner = this;\n\t\tthis._style = new Style(project._currentStyle, this, project);\n\t\tif (internal || hasProps && props.insert == false\n\t\t\t|| !settings.insertItems && !(hasProps && props.insert == true)) {\n\t\t\tthis._setProject(project);\n\t\t} else {\n\t\t\t(hasProps && props.parent || project)\n\t\t\t\t\t._insertItem(undefined, this, true);\n\t\t}\n\t\tif (hasProps && props !== Item.NO_INSERT && props !== Item.INSERT) {\n\t\t\tthis.set(props, {\n\t\t\t\tinternal: true, insert: true, project: true, parent: true\n\t\t\t});\n\t\t}\n\t\treturn hasProps;\n\t},\n\n\t_serialize: function(options, dictionary) {\n\t\tvar props = {},\n\t\t\tthat = this;\n\n\t\tfunction serialize(fields) {\n\t\t\tfor (var key in fields) {\n\t\t\t\tvar value = that[key];\n\t\t\t\tif (!Base.equals(value, key === 'leading'\n\t\t\t\t\t\t? fields.fontSize * 1.2 : fields[key])) {\n\t\t\t\t\tprops[key] = Base.serialize(value, options,\n\t\t\t\t\t\t\tkey !== 'data', dictionary);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tserialize(this._serializeFields);\n\t\tif (!(this instanceof Group))\n\t\t\tserialize(this._style._defaults);\n\t\treturn [ this._class, props ];\n\t},\n\n\t_changed: function(flags) {\n\t\tvar symbol = this._symbol,\n\t\t\tcacheParent = this._parent || symbol,\n\t\t\tproject = this._project;\n\t\tif (flags & 8) {\n\t\t\tthis._bounds = this._position = this._decomposed = undefined;\n\t\t}\n\t\tif (flags & 16) {\n\t\t\tthis._globalMatrix = undefined;\n\t\t}\n\t\tif (cacheParent\n\t\t\t\t&& (flags & 72)) {\n\t\t\tItem._clearBoundsCache(cacheParent);\n\t\t}\n\t\tif (flags & 2) {\n\t\t\tItem._clearBoundsCache(this);\n\t\t}\n\t\tif (project)\n\t\t\tproject._changed(flags, this);\n\t\tif (symbol)\n\t\t\tsymbol._changed(flags);\n\t},\n\n\tgetId: function() {\n\t\treturn this._id;\n\t},\n\n\tgetName: function() {\n\t\treturn this._name;\n\t},\n\n\tsetName: function(name) {\n\n\t\tif (this._name)\n\t\t\tthis._removeNamed();\n\t\tif (name === (+name) + '')\n\t\t\tthrow new Error(\n\t\t\t\t\t'Names consisting only of numbers are not supported.');\n\t\tvar owner = this._getOwner();\n\t\tif (name && owner) {\n\t\t\tvar children = owner._children,\n\t\t\t\tnamedChildren = owner._namedChildren;\n\t\t\t(namedChildren[name] = namedChildren[name] || []).push(this);\n\t\t\tif (!(name in children))\n\t\t\t\tchildren[name] = this;\n\t\t}\n\t\tthis._name = name || undefined;\n\t\tthis._changed(256);\n\t},\n\n\tgetStyle: function() {\n\t\treturn this._style;\n\t},\n\n\tsetStyle: function(style) {\n\t\tthis.getStyle().set(style);\n\t}\n}, Base.each(['locked', 'visible', 'blendMode', 'opacity', 'guide'],\n\tfunction(name) {\n\t\tvar part = Base.capitalize(name),\n\t\t\tkey = '_' + name,\n\t\t\tflags = {\n\t\t\t\tlocked: 256,\n\t\t\t\tvisible: 265\n\t\t\t};\n\t\tthis['get' + part] = function() {\n\t\t\treturn this[key];\n\t\t};\n\t\tthis['set' + part] = function(value) {\n\t\t\tif (value != this[key]) {\n\t\t\t\tthis[key] = value;\n\t\t\t\tthis._changed(flags[name] || 257);\n\t\t\t}\n\t\t};\n\t},\n{}), {\n\tbeans: true,\n\n\tgetSelection: function() {\n\t\treturn this._selection;\n\t},\n\n\tsetSelection: function(selection) {\n\t\tif (selection !== this._selection) {\n\t\t\tthis._selection = selection;\n\t\t\tvar project = this._project;\n\t\t\tif (project) {\n\t\t\t\tproject._updateSelection(this);\n\t\t\t\tthis._changed(257);\n\t\t\t}\n\t\t}\n\t},\n\n\t_changeSelection: function(flag, selected) {\n\t\tvar selection = this._selection;\n\t\tthis.setSelection(selected ? selection | flag : selection & ~flag);\n\t},\n\n\tisSelected: function() {\n\t\tif (this._selectChildren) {\n\t\t\tvar children = this._children;\n\t\t\tfor (var i = 0, l = children.length; i < l; i++)\n\t\t\t\tif (children[i].isSelected())\n\t\t\t\t\treturn true;\n\t\t}\n\t\treturn !!(this._selection & 1);\n\t},\n\n\tsetSelected: function(selected) {\n\t\tif (this._selectChildren) {\n\t\t\tvar children = this._children;\n\t\t\tfor (var i = 0, l = children.length; i < l; i++)\n\t\t\t\tchildren[i].setSelected(selected);\n\t\t}\n\t\tthis._changeSelection(1, selected);\n\t},\n\n\tisFullySelected: function() {\n\t\tvar children = this._children,\n\t\t\tselected = !!(this._selection & 1);\n\t\tif (children && selected) {\n\t\t\tfor (var i = 0, l = children.length; i < l; i++)\n\t\t\t\tif (!children[i].isFullySelected())\n\t\t\t\t\treturn false;\n\t\t\treturn true;\n\t\t}\n\t\treturn selected;\n\t},\n\n\tsetFullySelected: function(selected) {\n\t\tvar children = this._children;\n\t\tif (children) {\n\t\t\tfor (var i = 0, l = children.length; i < l; i++)\n\t\t\t\tchildren[i].setFullySelected(selected);\n\t\t}\n\t\tthis._changeSelection(1, selected);\n\t},\n\n\tisClipMask: function() {\n\t\treturn this._clipMask;\n\t},\n\n\tsetClipMask: function(clipMask) {\n\t\tif (this._clipMask != (clipMask = !!clipMask)) {\n\t\t\tthis._clipMask = clipMask;\n\t\t\tif (clipMask) {\n\t\t\t\tthis.setFillColor(null);\n\t\t\t\tthis.setStrokeColor(null);\n\t\t\t}\n\t\t\tthis._changed(257);\n\t\t\tif (this._parent)\n\t\t\t\tthis._parent._changed(2048);\n\t\t}\n\t},\n\n\tgetData: function() {\n\t\tif (!this._data)\n\t\t\tthis._data = {};\n\t\treturn this._data;\n\t},\n\n\tsetData: function(data) {\n\t\tthis._data = data;\n\t},\n\n\tgetPosition: function(_dontLink) {\n\t\tvar ctor = _dontLink ? Point : LinkedPoint;\n\t\tvar position = this._position ||\n\t\t\t(this._position = this._getPositionFromBounds());\n\t\treturn new ctor(position.x, position.y, this, 'setPosition');\n\t},\n\n\tsetPosition: function() {\n\t\tthis.translate(Point.read(arguments).subtract(this.getPosition(true)));\n\t},\n\n\t_getPositionFromBounds: function(bounds) {\n\t\treturn this._pivot\n\t\t\t\t? this._matrix._transformPoint(this._pivot)\n\t\t\t\t: (bounds || this.getBounds()).getCenter(true);\n\t},\n\n\tgetPivot: function() {\n\t\tvar pivot = this._pivot;\n\t\treturn pivot\n\t\t\t\t? new LinkedPoint(pivot.x, pivot.y, this, 'setPivot')\n\t\t\t\t: null;\n\t},\n\n\tsetPivot: function() {\n\t\tthis._pivot = Point.read(arguments, 0, { clone: true, readNull: true });\n\t\tthis._position = undefined;\n\t}\n}, Base.each({\n\t\tgetStrokeBounds: { stroke: true },\n\t\tgetHandleBounds: { handle: true },\n\t\tgetInternalBounds: { internal: true }\n\t},\n\tfunction(options, key) {\n\t\tthis[key] = function(matrix) {\n\t\t\treturn this.getBounds(matrix, options);\n\t\t};\n\t},\n{\n\tbeans: true,\n\n\tgetBounds: function(matrix, options) {\n\t\tvar hasMatrix = options || matrix instanceof Matrix,\n\t\t\topts = Base.set({}, hasMatrix ? options : matrix,\n\t\t\t\t\tthis._boundsOptions);\n\t\tif (!opts.stroke || this.getStrokeScaling())\n\t\t\topts.cacheItem = this;\n\t\tvar rect = this._getCachedBounds(hasMatrix && matrix, opts).rect;\n\t\treturn !arguments.length\n\t\t\t\t? new LinkedRectangle(rect.x, rect.y, rect.width, rect.height,\n\t\t\t\t\tthis, 'setBounds')\n\t\t\t\t: rect;\n\t},\n\n\tsetBounds: function() {\n\t\tvar rect = Rectangle.read(arguments),\n\t\t\tbounds = this.getBounds(),\n\t\t\t_matrix = this._matrix,\n\t\t\tmatrix = new Matrix(),\n\t\t\tcenter = rect.getCenter();\n\t\tmatrix.translate(center);\n\t\tif (rect.width != bounds.width || rect.height != bounds.height) {\n\t\t\tif (!_matrix.isInvertible()) {\n\t\t\t\t_matrix.set(_matrix._backup\n\t\t\t\t\t\t|| new Matrix().translate(_matrix.getTranslation()));\n\t\t\t\tbounds = this.getBounds();\n\t\t\t}\n\t\t\tmatrix.scale(\n\t\t\t\t\tbounds.width !== 0 ? rect.width / bounds.width : 0,\n\t\t\t\t\tbounds.height !== 0 ? rect.height / bounds.height : 0);\n\t\t}\n\t\tcenter = bounds.getCenter();\n\t\tmatrix.translate(-center.x, -center.y);\n\t\tthis.transform(matrix);\n\t},\n\n\t_getBounds: function(matrix, options) {\n\t\tvar children = this._children;\n\t\tif (!children || !children.length)\n\t\t\treturn new Rectangle();\n\t\tItem._updateBoundsCache(this, options.cacheItem);\n\t\treturn Item._getBounds(children, matrix, options);\n\t},\n\n\t_getBoundsCacheKey: function(options, internal) {\n\t\treturn [\n\t\t\toptions.stroke ? 1 : 0,\n\t\t\toptions.handle ? 1 : 0,\n\t\t\tinternal ? 1 : 0\n\t\t].join('');\n\t},\n\n\t_getCachedBounds: function(matrix, options, noInternal) {\n\t\tmatrix = matrix && matrix._orNullIfIdentity();\n\t\tvar internal = options.internal && !noInternal,\n\t\t\tcacheItem = options.cacheItem,\n\t\t\t_matrix = internal ? null : this._matrix._orNullIfIdentity(),\n\t\t\tcacheKey = cacheItem && (!matrix || matrix.equals(_matrix))\n\t\t\t\t&& this._getBoundsCacheKey(options, internal),\n\t\t\tbounds = this._bounds;\n\t\tItem._updateBoundsCache(this._parent || this._symbol, cacheItem);\n\t\tif (cacheKey && bounds && cacheKey in bounds) {\n\t\t\tvar cached = bounds[cacheKey];\n\t\t\treturn {\n\t\t\t\trect: cached.rect.clone(),\n\t\t\t\tnonscaling: cached.nonscaling\n\t\t\t};\n\t\t}\n\t\tvar res = this._getBounds(matrix || _matrix, options),\n\t\t\trect = res.rect || res,\n\t\t\tstyle = this._style,\n\t\t\tnonscaling = res.nonscaling || style.hasStroke()\n\t\t\t\t&& !style.getStrokeScaling();\n\t\tif (cacheKey) {\n\t\t\tif (!bounds) {\n\t\t\t\tthis._bounds = bounds = {};\n\t\t\t}\n\t\t\tvar cached = bounds[cacheKey] = {\n\t\t\t\trect: rect.clone(),\n\t\t\t\tnonscaling: nonscaling,\n\t\t\t\tinternal: internal\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\trect: rect,\n\t\t\tnonscaling: nonscaling\n\t\t};\n\t},\n\n\t_getStrokeMatrix: function(matrix, options) {\n\t\tvar parent = this.getStrokeScaling() ? null\n\t\t\t\t: options && options.internal ? this\n\t\t\t\t\t: this._parent || this._symbol && this._symbol._item,\n\t\t\tmx = parent ? parent.getViewMatrix().invert() : matrix;\n\t\treturn mx && mx._shiftless();\n\t},\n\n\tstatics: {\n\t\t_updateBoundsCache: function(parent, item) {\n\t\t\tif (parent && item) {\n\t\t\t\tvar id = item._id,\n\t\t\t\t\tref = parent._boundsCache = parent._boundsCache || {\n\t\t\t\t\t\tids: {},\n\t\t\t\t\t\tlist: []\n\t\t\t\t\t};\n\t\t\t\tif (!ref.ids[id]) {\n\t\t\t\t\tref.list.push(item);\n\t\t\t\t\tref.ids[id] = item;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_clearBoundsCache: function(item) {\n\t\t\tvar cache = item._boundsCache;\n\t\t\tif (cache) {\n\t\t\t\titem._bounds = item._position = item._boundsCache = undefined;\n\t\t\t\tfor (var i = 0, list = cache.list, l = list.length; i < l; i++){\n\t\t\t\t\tvar other = list[i];\n\t\t\t\t\tif (other !== item) {\n\t\t\t\t\t\tother._bounds = other._position = undefined;\n\t\t\t\t\t\tif (other._boundsCache)\n\t\t\t\t\t\t\tItem._clearBoundsCache(other);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_getBounds: function(items, matrix, options) {\n\t\t\tvar x1 = Infinity,\n\t\t\t\tx2 = -x1,\n\t\t\t\ty1 = x1,\n\t\t\t\ty2 = x2,\n\t\t\t\tnonscaling = false;\n\t\t\toptions = options || {};\n\t\t\tfor (var i = 0, l = items.length; i < l; i++) {\n\t\t\t\tvar item = items[i];\n\t\t\t\tif (item._visible && !item.isEmpty(true)) {\n\t\t\t\t\tvar bounds = item._getCachedBounds(\n\t\t\t\t\t\tmatrix && matrix.appended(item._matrix), options, true),\n\t\t\t\t\t\trect = bounds.rect;\n\t\t\t\t\tx1 = Math.min(rect.x, x1);\n\t\t\t\t\ty1 = Math.min(rect.y, y1);\n\t\t\t\t\tx2 = Math.max(rect.x + rect.width, x2);\n\t\t\t\t\ty2 = Math.max(rect.y + rect.height, y2);\n\t\t\t\t\tif (bounds.nonscaling)\n\t\t\t\t\t\tnonscaling = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\trect: isFinite(x1)\n\t\t\t\t\t? new Rectangle(x1, y1, x2 - x1, y2 - y1)\n\t\t\t\t\t: new Rectangle(),\n\t\t\t\tnonscaling: nonscaling\n\t\t\t};\n\t\t}\n\t}\n\n}), {\n\tbeans: true,\n\n\t_decompose: function() {\n\t\treturn this._applyMatrix\n\t\t\t? null\n\t\t\t: this._decomposed || (this._decomposed = this._matrix.decompose());\n\t},\n\n\tgetRotation: function() {\n\t\tvar decomposed = this._decompose();\n\t\treturn decomposed ? decomposed.rotation : 0;\n\t},\n\n\tsetRotation: function(rotation) {\n\t\tvar current = this.getRotation();\n\t\tif (current != null && rotation != null) {\n\t\t\tvar decomposed = this._decomposed;\n\t\t\tthis.rotate(rotation - current);\n\t\t\tif (decomposed) {\n\t\t\t\tdecomposed.rotation = rotation;\n\t\t\t\tthis._decomposed = decomposed;\n\t\t\t}\n\t\t}\n\t},\n\n\tgetScaling: function() {\n\t\tvar decomposed = this._decompose(),\n\t\t\ts = decomposed && decomposed.scaling;\n\t\treturn new LinkedPoint(s ? s.x : 1, s ? s.y : 1, this, 'setScaling');\n\t},\n\n\tsetScaling: function() {\n\t\tvar current = this.getScaling(),\n\t\t\tscaling = Point.read(arguments, 0, { clone: true, readNull: true });\n\t\tif (current && scaling && !current.equals(scaling)) {\n\t\t\tvar rotation = this.getRotation(),\n\t\t\t\tdecomposed = this._decomposed,\n\t\t\t\tmatrix = new Matrix(),\n\t\t\t\tisZero = Numerical.isZero;\n\t\t\tif (isZero(current.x) || isZero(current.y)) {\n\t\t\t\tmatrix.translate(decomposed.translation);\n\t\t\t\tif (rotation) {\n\t\t\t\t\tmatrix.rotate(rotation);\n\t\t\t\t}\n\t\t\t\tmatrix.scale(scaling.x, scaling.y);\n\t\t\t\tthis._matrix.set(matrix);\n\t\t\t} else {\n\t\t\t\tvar center = this.getPosition(true);\n\t\t\t\tmatrix.translate(center);\n\t\t\t\tif (rotation)\n\t\t\t\t\tmatrix.rotate(rotation);\n\t\t\t\tmatrix.scale(scaling.x / current.x, scaling.y / current.y);\n\t\t\t\tif (rotation)\n\t\t\t\t\tmatrix.rotate(-rotation);\n\t\t\t\tmatrix.translate(center.negate());\n\t\t\t\tthis.transform(matrix);\n\t\t\t}\n\t\t\tif (decomposed) {\n\t\t\t\tdecomposed.scaling = scaling;\n\t\t\t\tthis._decomposed = decomposed;\n\t\t\t}\n\t\t}\n\t},\n\n\tgetMatrix: function() {\n\t\treturn this._matrix;\n\t},\n\n\tsetMatrix: function() {\n\t\tvar matrix = this._matrix;\n\t\tmatrix.set.apply(matrix, arguments);\n\t},\n\n\tgetGlobalMatrix: function(_dontClone) {\n\t\tvar matrix = this._globalMatrix;\n\t\tif (matrix) {\n\t\t\tvar parent = this._parent;\n\t\t\tvar parents = [];\n\t\t\twhile (parent) {\n\t\t\t\tif (!parent._globalMatrix) {\n\t\t\t\t\tmatrix = null;\n\t\t\t\t\tfor (var i = 0, l = parents.length; i < l; i++) {\n\t\t\t\t\t\tparents[i]._globalMatrix = null;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tparents.push(parent);\n\t\t\t\tparent = parent._parent;\n\t\t\t}\n\t\t}\n\t\tif (!matrix) {\n\t\t\tmatrix = this._globalMatrix = this._matrix.clone();\n\t\t\tvar parent = this._parent;\n\t\t\tif (parent)\n\t\t\t\tmatrix.prepend(parent.getGlobalMatrix(true));\n\t\t}\n\t\treturn _dontClone ? matrix : matrix.clone();\n\t},\n\n\tgetViewMatrix: function() {\n\t\treturn this.getGlobalMatrix().prepend(this.getView()._matrix);\n\t},\n\n\tgetApplyMatrix: function() {\n\t\treturn this._applyMatrix;\n\t},\n\n\tsetApplyMatrix: function(apply) {\n\t\tif (this._applyMatrix = this._canApplyMatrix && !!apply)\n\t\t\tthis.transform(null, true);\n\t},\n\n\tgetTransformContent: '#getApplyMatrix',\n\tsetTransformContent: '#setApplyMatrix',\n}, {\n\tgetProject: function() {\n\t\treturn this._project;\n\t},\n\n\t_setProject: function(project, installEvents) {\n\t\tif (this._project !== project) {\n\t\t\tif (this._project)\n\t\t\t\tthis._installEvents(false);\n\t\t\tthis._project = project;\n\t\t\tvar children = this._children;\n\t\t\tfor (var i = 0, l = children && children.length; i < l; i++)\n\t\t\t\tchildren[i]._setProject(project);\n\t\t\tinstallEvents = true;\n\t\t}\n\t\tif (installEvents)\n\t\t\tthis._installEvents(true);\n\t},\n\n\tgetView: function() {\n\t\treturn this._project._view;\n\t},\n\n\t_installEvents: function _installEvents(install) {\n\t\t_installEvents.base.call(this, install);\n\t\tvar children = this._children;\n\t\tfor (var i = 0, l = children && children.length; i < l; i++)\n\t\t\tchildren[i]._installEvents(install);\n\t},\n\n\tgetLayer: function() {\n\t\tvar parent = this;\n\t\twhile (parent = parent._parent) {\n\t\t\tif (parent instanceof Layer)\n\t\t\t\treturn parent;\n\t\t}\n\t\treturn null;\n\t},\n\n\tgetParent: function() {\n\t\treturn this._parent;\n\t},\n\n\tsetParent: function(item) {\n\t\treturn item.addChild(this);\n\t},\n\n\t_getOwner: '#getParent',\n\n\tgetChildren: function() {\n\t\treturn this._children;\n\t},\n\n\tsetChildren: function(items) {\n\t\tthis.removeChildren();\n\t\tthis.addChildren(items);\n\t},\n\n\tgetFirstChild: function() {\n\t\treturn this._children && this._children[0] || null;\n\t},\n\n\tgetLastChild: function() {\n\t\treturn this._children && this._children[this._children.length - 1]\n\t\t\t\t|| null;\n\t},\n\n\tgetNextSibling: function() {\n\t\tvar owner = this._getOwner();\n\t\treturn owner && owner._children[this._index + 1] || null;\n\t},\n\n\tgetPreviousSibling: function() {\n\t\tvar owner = this._getOwner();\n\t\treturn owner && owner._children[this._index - 1] || null;\n\t},\n\n\tgetIndex: function() {\n\t\treturn this._index;\n\t},\n\n\tsetIndex: function(index) {\n\t\tvar parent = this._parent,\n\t\t\tchildren = parent && parent._children;\n\t\tif (children) {\n\t\t\tparent.insertChildren(index in children ? index : undefined,\n\t\t\t\t\t\t\t\t [this]);\n\t\t}\n\t},\n\n\tequals: function(item) {\n\t\treturn item === this || item && this._class === item._class\n\t\t\t\t&& this._style.equals(item._style)\n\t\t\t\t&& this._matrix.equals(item._matrix)\n\t\t\t\t&& this._locked === item._locked\n\t\t\t\t&& this._visible === item._visible\n\t\t\t\t&& this._blendMode === item._blendMode\n\t\t\t\t&& this._opacity === item._opacity\n\t\t\t\t&& this._clipMask === item._clipMask\n\t\t\t\t&& this._guide === item._guide\n\t\t\t\t&& this._equals(item)\n\t\t\t\t|| false;\n\t},\n\n\t_equals: function(item) {\n\t\treturn Base.equals(this._children, item._children);\n\t},\n\n\tclone: function(options) {\n\t\tvar copy = new this.constructor(Item.NO_INSERT),\n\t\t\tchildren = this._children,\n\t\t\tinsert = Base.pick(options ? options.insert : undefined,\n\t\t\t\t\toptions === undefined || options === true),\n\t\t\tdeep = Base.pick(options ? options.deep : undefined, true);\n\t\tif (children)\n\t\t\tcopy.copyAttributes(this);\n\t\tif (!children || deep)\n\t\t\tcopy.copyContent(this);\n\t\tif (!children)\n\t\t\tcopy.copyAttributes(this);\n\t\tif (insert)\n\t\t\tcopy.insertAbove(this);\n\t\tvar name = this._name,\n\t\t\tparent = this._parent;\n\t\tif (name && parent) {\n\t\t\tvar children = parent._children,\n\t\t\t\torig = name,\n\t\t\t\ti = 1;\n\t\t\twhile (children[name])\n\t\t\t\tname = orig + ' ' + (i++);\n\t\t\tif (name !== orig)\n\t\t\t\tcopy.setName(name);\n\t\t}\n\t\treturn copy;\n\t},\n\n\tcopyContent: function(source) {\n\t\tvar children = source._children;\n\t\tfor (var i = 0, l = children && children.length; i < l; i++) {\n\t\t\tthis.addChild(children[i].clone(false), true);\n\t\t}\n\t},\n\n\tcopyAttributes: function(source, excludeMatrix) {\n\t\tthis.setStyle(source._style);\n\t\tvar keys = ['_locked', '_visible', '_blendMode', '_opacity',\n\t\t\t\t'_clipMask', '_guide'];\n\t\tfor (var i = 0, l = keys.length; i < l; i++) {\n\t\t\tvar key = keys[i];\n\t\t\tif (source.hasOwnProperty(key))\n\t\t\t\tthis[key] = source[key];\n\t\t}\n\t\tif (!excludeMatrix)\n\t\t\tthis._matrix.set(source._matrix, true);\n\t\tthis.setApplyMatrix(source._applyMatrix);\n\t\tthis.setPivot(source._pivot);\n\t\tthis.setSelection(source._selection);\n\t\tvar data = source._data,\n\t\t\tname = source._name;\n\t\tthis._data = data ? Base.clone(data) : null;\n\t\tif (name)\n\t\t\tthis.setName(name);\n\t},\n\n\trasterize: function(arg0, arg1) {\n\t\tvar resolution,\n\t\t\tinsert,\n\t\t\traster;\n\t\tif (Base.isPlainObject(arg0)) {\n\t\t\tresolution = arg0.resolution;\n\t\t\tinsert = arg0.insert;\n\t\t\traster = arg0.raster;\n\t\t} else {\n\t\t\tresolution = arg0;\n\t\t\tinsert = arg1;\n\t\t}\n\t\tif (!raster) {\n\t\t\traster = new Raster(Item.NO_INSERT);\n\t\t}\n\t\tvar bounds = this.getStrokeBounds(),\n\t\t\tscale = (resolution || this.getView().getResolution()) / 72,\n\t\t\ttopLeft = bounds.getTopLeft().floor(),\n\t\t\tbottomRight = bounds.getBottomRight().ceil(),\n\t\t\tboundsSize = new Size(bottomRight.subtract(topLeft)),\n\t\t\trasterSize = boundsSize.multiply(scale);\n\t\traster.setSize(rasterSize, true);\n\n\t\tif (!rasterSize.isZero()) {\n\t\t\tvar ctx = raster.getContext(true),\n\t\t\t\tmatrix = new Matrix().scale(scale).translate(topLeft.negate());\n\t\t\tctx.save();\n\t\t\tmatrix.applyToContext(ctx);\n\t\t\tthis.draw(ctx, new Base({ matrices: [matrix] }));\n\t\t\tctx.restore();\n\t\t}\n\t\traster._matrix.set(\n\t\t\tnew Matrix()\n\t\t\t\t.translate(topLeft.add(boundsSize.divide(2)))\n\t\t\t\t.scale(1 / scale)\n\t\t);\n\t\tif (insert === undefined || insert) {\n\t\t\traster.insertAbove(this);\n\t\t}\n\t\treturn raster;\n\t},\n\n\tcontains: function() {\n\t\tvar matrix = this._matrix;\n\t\treturn (\n\t\t\tmatrix.isInvertible() &&\n\t\t\t!!this._contains(matrix._inverseTransform(Point.read(arguments)))\n\t\t);\n\t},\n\n\t_contains: function(point) {\n\t\tvar children = this._children;\n\t\tif (children) {\n\t\t\tfor (var i = children.length - 1; i >= 0; i--) {\n\t\t\t\tif (children[i].contains(point))\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\treturn point.isInside(this.getInternalBounds());\n\t},\n\n\tisInside: function() {\n\t\treturn Rectangle.read(arguments).contains(this.getBounds());\n\t},\n\n\t_asPathItem: function() {\n\t\treturn new Path.Rectangle({\n\t\t\trectangle: this.getInternalBounds(),\n\t\t\tmatrix: this._matrix,\n\t\t\tinsert: false,\n\t\t});\n\t},\n\n\tintersects: function(item, _matrix) {\n\t\tif (!(item instanceof Item))\n\t\t\treturn false;\n\t\treturn this._asPathItem().getIntersections(item._asPathItem(), null,\n\t\t\t\t_matrix, true).length > 0;\n\t}\n},\nnew function() {\n\tfunction hitTest() {\n\t\tvar args = arguments;\n\t\treturn this._hitTest(\n\t\t\t\tPoint.read(args),\n\t\t\t\tHitResult.getOptions(args));\n\t}\n\n\tfunction hitTestAll() {\n\t\tvar args = arguments,\n\t\t\tpoint = Point.read(args),\n\t\t\toptions = HitResult.getOptions(args),\n\t\t\tall = [];\n\t\tthis._hitTest(point, new Base({ all: all }, options));\n\t\treturn all;\n\t}\n\n\tfunction hitTestChildren(point, options, viewMatrix, _exclude) {\n\t\tvar children = this._children;\n\t\tif (children) {\n\t\t\tfor (var i = children.length - 1; i >= 0; i--) {\n\t\t\t\tvar child = children[i];\n\t\t\t\tvar res = child !== _exclude && child._hitTest(point, options,\n\t\t\t\t\t\tviewMatrix);\n\t\t\t\tif (res && !options.all)\n\t\t\t\t\treturn res;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tProject.inject({\n\t\thitTest: hitTest,\n\t\thitTestAll: hitTestAll,\n\t\t_hitTest: hitTestChildren\n\t});\n\n\treturn {\n\t\thitTest: hitTest,\n\t\thitTestAll: hitTestAll,\n\t\t_hitTestChildren: hitTestChildren,\n\t};\n}, {\n\n\t_hitTest: function(point, options, parentViewMatrix) {\n\t\tif (this._locked || !this._visible || this._guide && !options.guides\n\t\t\t\t|| this.isEmpty()) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar matrix = this._matrix,\n\t\t\tviewMatrix = parentViewMatrix\n\t\t\t\t\t? parentViewMatrix.appended(matrix)\n\t\t\t\t\t: this.getGlobalMatrix().prepend(this.getView()._matrix),\n\t\t\ttolerance = Math.max(options.tolerance, 1e-12),\n\t\t\ttolerancePadding = options._tolerancePadding = new Size(\n\t\t\t\t\tPath._getStrokePadding(tolerance,\n\t\t\t\t\t\tmatrix._shiftless().invert()));\n\t\tpoint = matrix._inverseTransform(point);\n\t\tif (!point || !this._children &&\n\t\t\t!this.getBounds({ internal: true, stroke: true, handle: true })\n\t\t\t\t.expand(tolerancePadding.multiply(2))._containsPoint(point)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar checkSelf = !(options.guides && !this._guide\n\t\t\t\t|| options.selected && !this.isSelected()\n\t\t\t\t|| options.type && options.type !== Base.hyphenate(this._class)\n\t\t\t\t|| options.class && !(this instanceof options.class)),\n\t\t\tmatch = options.match,\n\t\t\tthat = this,\n\t\t\tbounds,\n\t\t\tres;\n\n\t\tfunction filter(hit) {\n\t\t\tif (hit && match && !match(hit))\n\t\t\t\thit = null;\n\t\t\tif (hit && options.all)\n\t\t\t\toptions.all.push(hit);\n\t\t\treturn hit;\n\t\t}\n\n\t\tfunction checkPoint(type, part) {\n\t\t\tvar pt = part ? bounds['get' + part]() : that.getPosition();\n\t\t\tif (point.subtract(pt).divide(tolerancePadding).length <= 1) {\n\t\t\t\treturn new HitResult(type, that, {\n\t\t\t\t\tname: part ? Base.hyphenate(part) : type,\n\t\t\t\t\tpoint: pt\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tvar checkPosition = options.position,\n\t\t\tcheckCenter = options.center,\n\t\t\tcheckBounds = options.bounds;\n\t\tif (checkSelf && this._parent\n\t\t\t\t&& (checkPosition || checkCenter || checkBounds)) {\n\t\t\tif (checkCenter || checkBounds) {\n\t\t\t\tbounds = this.getInternalBounds();\n\t\t\t}\n\t\t\tres = checkPosition && checkPoint('position') ||\n\t\t\t\t\tcheckCenter && checkPoint('center', 'Center');\n\t\t\tif (!res && checkBounds) {\n\t\t\t\tvar points = [\n\t\t\t\t\t'TopLeft', 'TopRight', 'BottomLeft', 'BottomRight',\n\t\t\t\t\t'LeftCenter', 'TopCenter', 'RightCenter', 'BottomCenter'\n\t\t\t\t];\n\t\t\t\tfor (var i = 0; i < 8 && !res; i++) {\n\t\t\t\t\tres = checkPoint('bounds', points[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tres = filter(res);\n\t\t}\n\n\t\tif (!res) {\n\t\t\tres = this._hitTestChildren(point, options, viewMatrix)\n\t\t\t\t|| checkSelf\n\t\t\t\t\t&& filter(this._hitTestSelf(point, options, viewMatrix,\n\t\t\t\t\t\tthis.getStrokeScaling() ? null\n\t\t\t\t\t\t\t: viewMatrix._shiftless().invert()))\n\t\t\t\t|| null;\n\t\t}\n\t\tif (res && res.point) {\n\t\t\tres.point = matrix.transform(res.point);\n\t\t}\n\t\treturn res;\n\t},\n\n\t_hitTestSelf: function(point, options) {\n\t\tif (options.fill && this.hasFill() && this._contains(point))\n\t\t\treturn new HitResult('fill', this);\n\t},\n\n\tmatches: function(name, compare) {\n\t\tfunction matchObject(obj1, obj2) {\n\t\t\tfor (var i in obj1) {\n\t\t\t\tif (obj1.hasOwnProperty(i)) {\n\t\t\t\t\tvar val1 = obj1[i],\n\t\t\t\t\t\tval2 = obj2[i];\n\t\t\t\t\tif (Base.isPlainObject(val1) && Base.isPlainObject(val2)) {\n\t\t\t\t\t\tif (!matchObject(val1, val2))\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else if (!Base.equals(val1, val2)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tvar type = typeof name;\n\t\tif (type === 'object') {\n\t\t\tfor (var key in name) {\n\t\t\t\tif (name.hasOwnProperty(key) && !this.matches(key, name[key]))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t} else if (type === 'function') {\n\t\t\treturn name(this);\n\t\t} else if (name === 'match') {\n\t\t\treturn compare(this);\n\t\t} else {\n\t\t\tvar value = /^(empty|editable)$/.test(name)\n\t\t\t\t\t? this['is' + Base.capitalize(name)]()\n\t\t\t\t\t: name === 'type'\n\t\t\t\t\t\t? Base.hyphenate(this._class)\n\t\t\t\t\t\t: this[name];\n\t\t\tif (name === 'class') {\n\t\t\t\tif (typeof compare === 'function')\n\t\t\t\t\treturn this instanceof compare;\n\t\t\t\tvalue = this._class;\n\t\t\t}\n\t\t\tif (typeof compare === 'function') {\n\t\t\t\treturn !!compare(value);\n\t\t\t} else if (compare) {\n\t\t\t\tif (compare.test) {\n\t\t\t\t\treturn compare.test(value);\n\t\t\t\t} else if (Base.isPlainObject(compare)) {\n\t\t\t\t\treturn matchObject(compare, value);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn Base.equals(value, compare);\n\t\t}\n\t},\n\n\tgetItems: function(options) {\n\t\treturn Item._getItems(this, options, this._matrix);\n\t},\n\n\tgetItem: function(options) {\n\t\treturn Item._getItems(this, options, this._matrix, null, true)[0]\n\t\t\t\t|| null;\n\t},\n\n\tstatics: {\n\t\t_getItems: function _getItems(item, options, matrix, param, firstOnly) {\n\t\t\tif (!param) {\n\t\t\t\tvar obj = typeof options === 'object' && options,\n\t\t\t\t\toverlapping = obj && obj.overlapping,\n\t\t\t\t\tinside = obj && obj.inside,\n\t\t\t\t\tbounds = overlapping || inside,\n\t\t\t\t\trect = bounds && Rectangle.read([bounds]);\n\t\t\t\tparam = {\n\t\t\t\t\titems: [],\n\t\t\t\t\trecursive: obj && obj.recursive !== false,\n\t\t\t\t\tinside: !!inside,\n\t\t\t\t\toverlapping: !!overlapping,\n\t\t\t\t\trect: rect,\n\t\t\t\t\tpath: overlapping && new Path.Rectangle({\n\t\t\t\t\t\trectangle: rect,\n\t\t\t\t\t\tinsert: false\n\t\t\t\t\t})\n\t\t\t\t};\n\t\t\t\tif (obj) {\n\t\t\t\t\toptions = Base.filter({}, options, {\n\t\t\t\t\t\trecursive: true, inside: true, overlapping: true\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar children = item._children,\n\t\t\t\titems = param.items,\n\t\t\t\trect = param.rect;\n\t\t\tmatrix = rect && (matrix || new Matrix());\n\t\t\tfor (var i = 0, l = children && children.length; i < l; i++) {\n\t\t\t\tvar child = children[i],\n\t\t\t\t\tchildMatrix = matrix && matrix.appended(child._matrix),\n\t\t\t\t\tadd = true;\n\t\t\t\tif (rect) {\n\t\t\t\t\tvar bounds = child.getBounds(childMatrix);\n\t\t\t\t\tif (!rect.intersects(bounds))\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tif (!(rect.contains(bounds)\n\t\t\t\t\t\t\t|| param.overlapping && (bounds.contains(rect)\n\t\t\t\t\t\t\t\t|| param.path.intersects(child, childMatrix))))\n\t\t\t\t\t\tadd = false;\n\t\t\t\t}\n\t\t\t\tif (add && child.matches(options)) {\n\t\t\t\t\titems.push(child);\n\t\t\t\t\tif (firstOnly)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (param.recursive !== false) {\n\t\t\t\t\t_getItems(child, options, childMatrix, param, firstOnly);\n\t\t\t\t}\n\t\t\t\tif (firstOnly && items.length > 0)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn items;\n\t\t}\n\t}\n}, {\n\n\timportJSON: function(json) {\n\t\tvar res = Base.importJSON(json, this);\n\t\treturn res !== this ? this.addChild(res) : res;\n\t},\n\n\taddChild: function(item) {\n\t\treturn this.insertChild(undefined, item);\n\t},\n\n\tinsertChild: function(index, item) {\n\t\tvar res = item ? this.insertChildren(index, [item]) : null;\n\t\treturn res && res[0];\n\t},\n\n\taddChildren: function(items) {\n\t\treturn this.insertChildren(this._children.length, items);\n\t},\n\n\tinsertChildren: function(index, items) {\n\t\tvar children = this._children;\n\t\tif (children && items && items.length > 0) {\n\t\t\titems = Base.slice(items);\n\t\t\tvar inserted = {};\n\t\t\tfor (var i = items.length - 1; i >= 0; i--) {\n\t\t\t\tvar item = items[i],\n\t\t\t\t\tid = item && item._id;\n\t\t\t\tif (!item || inserted[id]) {\n\t\t\t\t\titems.splice(i, 1);\n\t\t\t\t} else {\n\t\t\t\t\titem._remove(false, true);\n\t\t\t\t\tinserted[id] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tBase.splice(children, items, index, 0);\n\t\t\tvar project = this._project,\n\t\t\t\tnotifySelf = project._changes;\n\t\t\tfor (var i = 0, l = items.length; i < l; i++) {\n\t\t\t\tvar item = items[i],\n\t\t\t\t\tname = item._name;\n\t\t\t\titem._parent = this;\n\t\t\t\titem._setProject(project, true);\n\t\t\t\tif (name)\n\t\t\t\t\titem.setName(name);\n\t\t\t\tif (notifySelf)\n\t\t\t\t\titem._changed(5);\n\t\t\t}\n\t\t\tthis._changed(11);\n\t\t} else {\n\t\t\titems = null;\n\t\t}\n\t\treturn items;\n\t},\n\n\t_insertItem: '#insertChild',\n\n\t_insertAt: function(item, offset) {\n\t\tvar owner = item && item._getOwner(),\n\t\t\tres = item !== this && owner ? this : null;\n\t\tif (res) {\n\t\t\tres._remove(false, true);\n\t\t\towner._insertItem(item._index + offset, res);\n\t\t}\n\t\treturn res;\n\t},\n\n\tinsertAbove: function(item) {\n\t\treturn this._insertAt(item, 1);\n\t},\n\n\tinsertBelow: function(item) {\n\t\treturn this._insertAt(item, 0);\n\t},\n\n\tsendToBack: function() {\n\t\tvar owner = this._getOwner();\n\t\treturn owner ? owner._insertItem(0, this) : null;\n\t},\n\n\tbringToFront: function() {\n\t\tvar owner = this._getOwner();\n\t\treturn owner ? owner._insertItem(undefined, this) : null;\n\t},\n\n\tappendTop: '#addChild',\n\n\tappendBottom: function(item) {\n\t\treturn this.insertChild(0, item);\n\t},\n\n\tmoveAbove: '#insertAbove',\n\n\tmoveBelow: '#insertBelow',\n\n\taddTo: function(owner) {\n\t\treturn owner._insertItem(undefined, this);\n\t},\n\n\tcopyTo: function(owner) {\n\t\treturn this.clone(false).addTo(owner);\n\t},\n\n\treduce: function(options) {\n\t\tvar children = this._children;\n\t\tif (children && children.length === 1) {\n\t\t\tvar child = children[0].reduce(options);\n\t\t\tif (this._parent) {\n\t\t\t\tchild.insertAbove(this);\n\t\t\t\tthis.remove();\n\t\t\t} else {\n\t\t\t\tchild.remove();\n\t\t\t}\n\t\t\treturn child;\n\t\t}\n\t\treturn this;\n\t},\n\n\t_removeNamed: function() {\n\t\tvar owner = this._getOwner();\n\t\tif (owner) {\n\t\t\tvar children = owner._children,\n\t\t\t\tnamedChildren = owner._namedChildren,\n\t\t\t\tname = this._name,\n\t\t\t\tnamedArray = namedChildren[name],\n\t\t\t\tindex = namedArray ? namedArray.indexOf(this) : -1;\n\t\t\tif (index !== -1) {\n\t\t\t\tif (children[name] == this)\n\t\t\t\t\tdelete children[name];\n\t\t\t\tnamedArray.splice(index, 1);\n\t\t\t\tif (namedArray.length) {\n\t\t\t\t\tchildren[name] = namedArray[0];\n\t\t\t\t} else {\n\t\t\t\t\tdelete namedChildren[name];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_remove: function(notifySelf, notifyParent) {\n\t\tvar owner = this._getOwner(),\n\t\t\tproject = this._project,\n\t\t\tindex = this._index;\n\t\tif (this._style)\n\t\t\tthis._style._dispose();\n\t\tif (owner) {\n\t\t\tif (this._name)\n\t\t\t\tthis._removeNamed();\n\t\t\tif (index != null) {\n\t\t\t\tif (project._activeLayer === this)\n\t\t\t\t\tproject._activeLayer = this.getNextSibling()\n\t\t\t\t\t\t\t|| this.getPreviousSibling();\n\t\t\t\tBase.splice(owner._children, null, index, 1);\n\t\t\t}\n\t\t\tthis._installEvents(false);\n\t\t\tif (notifySelf && project._changes)\n\t\t\t\tthis._changed(5);\n\t\t\tif (notifyParent)\n\t\t\t\towner._changed(11, this);\n\t\t\tthis._parent = null;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},\n\n\tremove: function() {\n\t\treturn this._remove(true, true);\n\t},\n\n\treplaceWith: function(item) {\n\t\tvar ok = item && item.insertBelow(this);\n\t\tif (ok)\n\t\t\tthis.remove();\n\t\treturn ok;\n\t},\n\n\tremoveChildren: function(start, end) {\n\t\tif (!this._children)\n\t\t\treturn null;\n\t\tstart = start || 0;\n\t\tend = Base.pick(end, this._children.length);\n\t\tvar removed = Base.splice(this._children, null, start, end - start);\n\t\tfor (var i = removed.length - 1; i >= 0; i--) {\n\t\t\tremoved[i]._remove(true, false);\n\t\t}\n\t\tif (removed.length > 0)\n\t\t\tthis._changed(11);\n\t\treturn removed;\n\t},\n\n\tclear: '#removeChildren',\n\n\treverseChildren: function() {\n\t\tif (this._children) {\n\t\t\tthis._children.reverse();\n\t\t\tfor (var i = 0, l = this._children.length; i < l; i++)\n\t\t\t\tthis._children[i]._index = i;\n\t\t\tthis._changed(11);\n\t\t}\n\t},\n\n\tisEmpty: function(recursively) {\n\t\tvar children = this._children;\n\t\tvar numChildren = children ? children.length : 0;\n\t\tif (recursively) {\n\t\t\tfor (var i = 0; i < numChildren; i++) {\n\t\t\t\tif (!children[i].isEmpty(recursively)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn !numChildren;\n\t},\n\n\tisEditable: function() {\n\t\tvar item = this;\n\t\twhile (item) {\n\t\t\tif (!item._visible || item._locked)\n\t\t\t\treturn false;\n\t\t\titem = item._parent;\n\t\t}\n\t\treturn true;\n\t},\n\n\thasFill: function() {\n\t\treturn this.getStyle().hasFill();\n\t},\n\n\thasStroke: function() {\n\t\treturn this.getStyle().hasStroke();\n\t},\n\n\thasShadow: function() {\n\t\treturn this.getStyle().hasShadow();\n\t},\n\n\t_getOrder: function(item) {\n\t\tfunction getList(item) {\n\t\t\tvar list = [];\n\t\t\tdo {\n\t\t\t\tlist.unshift(item);\n\t\t\t} while (item = item._parent);\n\t\t\treturn list;\n\t\t}\n\t\tvar list1 = getList(this),\n\t\t\tlist2 = getList(item);\n\t\tfor (var i = 0, l = Math.min(list1.length, list2.length); i < l; i++) {\n\t\t\tif (list1[i] != list2[i]) {\n\t\t\t\treturn list1[i]._index < list2[i]._index ? 1 : -1;\n\t\t\t}\n\t\t}\n\t\treturn 0;\n\t},\n\n\thasChildren: function() {\n\t\treturn this._children && this._children.length > 0;\n\t},\n\n\tisInserted: function() {\n\t\treturn this._parent ? this._parent.isInserted() : false;\n\t},\n\n\tisAbove: function(item) {\n\t\treturn this._getOrder(item) === -1;\n\t},\n\n\tisBelow: function(item) {\n\t\treturn this._getOrder(item) === 1;\n\t},\n\n\tisParent: function(item) {\n\t\treturn this._parent === item;\n\t},\n\n\tisChild: function(item) {\n\t\treturn item && item._parent === this;\n\t},\n\n\tisDescendant: function(item) {\n\t\tvar parent = this;\n\t\twhile (parent = parent._parent) {\n\t\t\tif (parent === item)\n\t\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},\n\n\tisAncestor: function(item) {\n\t\treturn item ? item.isDescendant(this) : false;\n\t},\n\n\tisSibling: function(item) {\n\t\treturn this._parent === item._parent;\n\t},\n\n\tisGroupedWith: function(item) {\n\t\tvar parent = this._parent;\n\t\twhile (parent) {\n\t\t\tif (parent._parent\n\t\t\t\t&& /^(Group|Layer|CompoundPath)$/.test(parent._class)\n\t\t\t\t&& item.isDescendant(parent))\n\t\t\t\t\treturn true;\n\t\t\tparent = parent._parent;\n\t\t}\n\t\treturn false;\n\t},\n\n}, Base.each(['rotate', 'scale', 'shear', 'skew'], function(key) {\n\tvar rotate = key === 'rotate';\n\tthis[key] = function() {\n\t\tvar args = arguments,\n\t\t\tvalue = (rotate ? Base : Point).read(args),\n\t\t\tcenter = Point.read(args, 0, { readNull: true });\n\t\treturn this.transform(new Matrix()[key](value,\n\t\t\t\tcenter || this.getPosition(true)));\n\t};\n}, {\n\ttranslate: function() {\n\t\tvar mx = new Matrix();\n\t\treturn this.transform(mx.translate.apply(mx, arguments));\n\t},\n\n\ttransform: function(matrix, _applyRecursively, _setApplyMatrix) {\n\t\tvar _matrix = this._matrix,\n\t\t\ttransformMatrix = matrix && !matrix.isIdentity(),\n\t\t\tapplyMatrix = (\n\t\t\t\t_setApplyMatrix && this._canApplyMatrix ||\n\t\t\t\tthis._applyMatrix && (\n\t\t\t\t\ttransformMatrix || !_matrix.isIdentity() ||\n\t\t\t\t\t_applyRecursively && this._children\n\t\t\t\t)\n\t\t\t);\n\t\tif (!transformMatrix && !applyMatrix)\n\t\t\treturn this;\n\t\tif (transformMatrix) {\n\t\t\tif (!matrix.isInvertible() && _matrix.isInvertible())\n\t\t\t\t_matrix._backup = _matrix.getValues();\n\t\t\t_matrix.prepend(matrix, true);\n\t\t\tvar style = this._style,\n\t\t\t\tfillColor = style.getFillColor(true),\n\t\t\t\tstrokeColor = style.getStrokeColor(true);\n\t\t\tif (fillColor)\n\t\t\t\tfillColor.transform(matrix);\n\t\t\tif (strokeColor)\n\t\t\t\tstrokeColor.transform(matrix);\n\t\t}\n\n\t\tif (applyMatrix && (applyMatrix = this._transformContent(\n\t\t\t\t_matrix, _applyRecursively, _setApplyMatrix))) {\n\t\t\tvar pivot = this._pivot;\n\t\t\tif (pivot)\n\t\t\t\t_matrix._transformPoint(pivot, pivot, true);\n\t\t\t_matrix.reset(true);\n\t\t\tif (_setApplyMatrix && this._canApplyMatrix)\n\t\t\t\tthis._applyMatrix = true;\n\t\t}\n\t\tvar bounds = this._bounds,\n\t\t\tposition = this._position;\n\t\tif (transformMatrix || applyMatrix) {\n\t\t\tthis._changed(25);\n\t\t}\n\t\tvar decomp = transformMatrix && bounds && matrix.decompose();\n\t\tif (decomp && decomp.skewing.isZero() && decomp.rotation % 90 === 0) {\n\t\t\tfor (var key in bounds) {\n\t\t\t\tvar cache = bounds[key];\n\t\t\t\tif (cache.nonscaling) {\n\t\t\t\t\tdelete bounds[key];\n\t\t\t\t} else if (applyMatrix || !cache.internal) {\n\t\t\t\t\tvar rect = cache.rect;\n\t\t\t\t\tmatrix._transformBounds(rect, rect);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._bounds = bounds;\n\t\t\tvar cached = bounds[this._getBoundsCacheKey(\n\t\t\t\tthis._boundsOptions || {})];\n\t\t\tif (cached) {\n\t\t\t\tthis._position = this._getPositionFromBounds(cached.rect);\n\t\t\t}\n\t\t} else if (transformMatrix && position && this._pivot) {\n\t\t\tthis._position = matrix._transformPoint(position, position);\n\t\t}\n\t\treturn this;\n\t},\n\n\t_transformContent: function(matrix, applyRecursively, setApplyMatrix) {\n\t\tvar children = this._children;\n\t\tif (children) {\n\t\t\tfor (var i = 0, l = children.length; i < l; i++) {\n\t\t\t\tchildren[i].transform(matrix, applyRecursively, setApplyMatrix);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t},\n\n\tglobalToLocal: function() {\n\t\treturn this.getGlobalMatrix(true)._inverseTransform(\n\t\t\t\tPoint.read(arguments));\n\t},\n\n\tlocalToGlobal: function() {\n\t\treturn this.getGlobalMatrix(true)._transformPoint(\n\t\t\t\tPoint.read(arguments));\n\t},\n\n\tparentToLocal: function() {\n\t\treturn this._matrix._inverseTransform(Point.read(arguments));\n\t},\n\n\tlocalToParent: function() {\n\t\treturn this._matrix._transformPoint(Point.read(arguments));\n\t},\n\n\tfitBounds: function(rectangle, fill) {\n\t\trectangle = Rectangle.read(arguments);\n\t\tvar bounds = this.getBounds(),\n\t\t\titemRatio = bounds.height / bounds.width,\n\t\t\trectRatio = rectangle.height / rectangle.width,\n\t\t\tscale = (fill ? itemRatio > rectRatio : itemRatio < rectRatio)\n\t\t\t\t\t? rectangle.width / bounds.width\n\t\t\t\t\t: rectangle.height / bounds.height,\n\t\t\tnewBounds = new Rectangle(new Point(),\n\t\t\t\t\tnew Size(bounds.width * scale, bounds.height * scale));\n\t\tnewBounds.setCenter(rectangle.getCenter());\n\t\tthis.setBounds(newBounds);\n\t}\n}), {\n\n\t_setStyles: function(ctx, param, viewMatrix) {\n\t\tvar style = this._style,\n\t\t\tmatrix = this._matrix;\n\t\tif (style.hasFill()) {\n\t\t\tctx.fillStyle = style.getFillColor().toCanvasStyle(ctx, matrix);\n\t\t}\n\t\tif (style.hasStroke()) {\n\t\t\tctx.strokeStyle = style.getStrokeColor().toCanvasStyle(ctx, matrix);\n\t\t\tctx.lineWidth = style.getStrokeWidth();\n\t\t\tvar strokeJoin = style.getStrokeJoin(),\n\t\t\t\tstrokeCap = style.getStrokeCap(),\n\t\t\t\tmiterLimit = style.getMiterLimit();\n\t\t\tif (strokeJoin)\n\t\t\t\tctx.lineJoin = strokeJoin;\n\t\t\tif (strokeCap)\n\t\t\t\tctx.lineCap = strokeCap;\n\t\t\tif (miterLimit)\n\t\t\t\tctx.miterLimit = miterLimit;\n\t\t\tif (paper.support.nativeDash) {\n\t\t\t\tvar dashArray = style.getDashArray(),\n\t\t\t\t\tdashOffset = style.getDashOffset();\n\t\t\t\tif (dashArray && dashArray.length) {\n\t\t\t\t\tif ('setLineDash' in ctx) {\n\t\t\t\t\t\tctx.setLineDash(dashArray);\n\t\t\t\t\t\tctx.lineDashOffset = dashOffset;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tctx.mozDash = dashArray;\n\t\t\t\t\t\tctx.mozDashOffset = dashOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (style.hasShadow()) {\n\t\t\tvar pixelRatio = param.pixelRatio || 1,\n\t\t\t\tmx = viewMatrix._shiftless().prepend(\n\t\t\t\t\tnew Matrix().scale(pixelRatio, pixelRatio)),\n\t\t\t\tblur = mx.transform(new Point(style.getShadowBlur(), 0)),\n\t\t\t\toffset = mx.transform(this.getShadowOffset());\n\t\t\tctx.shadowColor = style.getShadowColor().toCanvasStyle(ctx);\n\t\t\tctx.shadowBlur = blur.getLength();\n\t\t\tctx.shadowOffsetX = offset.x;\n\t\t\tctx.shadowOffsetY = offset.y;\n\t\t}\n\t},\n\n\tdraw: function(ctx, param, parentStrokeMatrix) {\n\t\tvar updateVersion = this._updateVersion = this._project._updateVersion;\n\t\tif (!this._visible || this._opacity === 0)\n\t\t\treturn;\n\t\tvar matrices = param.matrices,\n\t\t\tviewMatrix = param.viewMatrix,\n\t\t\tmatrix = this._matrix,\n\t\t\tglobalMatrix = matrices[matrices.length - 1].appended(matrix);\n\t\tif (!globalMatrix.isInvertible())\n\t\t\treturn;\n\n\t\tviewMatrix = viewMatrix ? viewMatrix.appended(globalMatrix)\n\t\t\t\t: globalMatrix;\n\n\t\tmatrices.push(globalMatrix);\n\t\tif (param.updateMatrix) {\n\t\t\tthis._globalMatrix = globalMatrix;\n\t\t}\n\n\t\tvar blendMode = this._blendMode,\n\t\t\topacity = Numerical.clamp(this._opacity, 0, 1),\n\t\t\tnormalBlend = blendMode === 'normal',\n\t\t\tnativeBlend = BlendMode.nativeModes[blendMode],\n\t\t\tdirect = normalBlend && opacity === 1\n\t\t\t\t\t|| param.dontStart\n\t\t\t\t\t|| param.clip\n\t\t\t\t\t|| (nativeBlend || normalBlend && opacity < 1)\n\t\t\t\t\t\t&& this._canComposite(),\n\t\t\tpixelRatio = param.pixelRatio || 1,\n\t\t\tmainCtx, itemOffset, prevOffset;\n\t\tif (!direct) {\n\t\t\tvar bounds = this.getStrokeBounds(viewMatrix);\n\t\t\tif (!bounds.width || !bounds.height) {\n\t\t\t\tmatrices.pop();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tprevOffset = param.offset;\n\t\t\titemOffset = param.offset = bounds.getTopLeft().floor();\n\t\t\tmainCtx = ctx;\n\t\t\tctx = CanvasProvider.getContext(bounds.getSize().ceil().add(1)\n\t\t\t\t\t.multiply(pixelRatio));\n\t\t\tif (pixelRatio !== 1)\n\t\t\t\tctx.scale(pixelRatio, pixelRatio);\n\t\t}\n\t\tctx.save();\n\t\tvar strokeMatrix = parentStrokeMatrix\n\t\t\t\t? parentStrokeMatrix.appended(matrix)\n\t\t\t\t: this._canScaleStroke && !this.getStrokeScaling(true)\n\t\t\t\t\t&& viewMatrix,\n\t\t\tclip = !direct && param.clipItem,\n\t\t\ttransform = !strokeMatrix || clip;\n\t\tif (direct) {\n\t\t\tctx.globalAlpha = opacity;\n\t\t\tif (nativeBlend)\n\t\t\t\tctx.globalCompositeOperation = blendMode;\n\t\t} else if (transform) {\n\t\t\tctx.translate(-itemOffset.x, -itemOffset.y);\n\t\t}\n\t\tif (transform) {\n\t\t\t(direct ? matrix : viewMatrix).applyToContext(ctx);\n\t\t}\n\t\tif (clip) {\n\t\t\tparam.clipItem.draw(ctx, param.extend({ clip: true }));\n\t\t}\n\t\tif (strokeMatrix) {\n\t\t\tctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n\t\t\tvar offset = param.offset;\n\t\t\tif (offset)\n\t\t\t\tctx.translate(-offset.x, -offset.y);\n\t\t}\n\t\tthis._draw(ctx, param, viewMatrix, strokeMatrix);\n\t\tctx.restore();\n\t\tmatrices.pop();\n\t\tif (param.clip && !param.dontFinish) {\n\t\t\tctx.clip(this.getFillRule());\n\t\t}\n\t\tif (!direct) {\n\t\t\tBlendMode.process(blendMode, ctx, mainCtx, opacity,\n\t\t\t\t\titemOffset.subtract(prevOffset).multiply(pixelRatio));\n\t\t\tCanvasProvider.release(ctx);\n\t\t\tparam.offset = prevOffset;\n\t\t}\n\t},\n\n\t_isUpdated: function(updateVersion) {\n\t\tvar parent = this._parent;\n\t\tif (parent instanceof CompoundPath)\n\t\t\treturn parent._isUpdated(updateVersion);\n\t\tvar updated = this._updateVersion === updateVersion;\n\t\tif (!updated && parent && parent._visible\n\t\t\t\t&& parent._isUpdated(updateVersion)) {\n\t\t\tthis._updateVersion = updateVersion;\n\t\t\tupdated = true;\n\t\t}\n\t\treturn updated;\n\t},\n\n\t_drawSelection: function(ctx, matrix, size, selectionItems, updateVersion) {\n\t\tvar selection = this._selection,\n\t\t\titemSelected = selection & 1,\n\t\t\tboundsSelected = selection & 2\n\t\t\t\t\t|| itemSelected && this._selectBounds,\n\t\t\tpositionSelected = selection & 4;\n\t\tif (!this._drawSelected)\n\t\t\titemSelected = false;\n\t\tif ((itemSelected || boundsSelected || positionSelected)\n\t\t\t\t&& this._isUpdated(updateVersion)) {\n\t\t\tvar layer,\n\t\t\t\tcolor = this.getSelectedColor(true) || (layer = this.getLayer())\n\t\t\t\t\t&& layer.getSelectedColor(true),\n\t\t\t\tmx = matrix.appended(this.getGlobalMatrix(true)),\n\t\t\t\thalf = size / 2;\n\t\t\tctx.strokeStyle = ctx.fillStyle = color\n\t\t\t\t\t? color.toCanvasStyle(ctx) : '#009dec';\n\t\t\tif (itemSelected)\n\t\t\t\tthis._drawSelected(ctx, mx, selectionItems);\n\t\t\tif (positionSelected) {\n\t\t\t\tvar pos = this.getPosition(true),\n\t\t\t\t\tparent = this._parent,\n\t\t\t\t\tpoint = parent ? parent.localToGlobal(pos) : pos,\n\t\t\t\t\tx = point.x,\n\t\t\t\t\ty = point.y;\n\t\t\t\tctx.beginPath();\n\t\t\t\tctx.arc(x, y, half, 0, Math.PI * 2, true);\n\t\t\t\tctx.stroke();\n\t\t\t\tvar deltas = [[0, -1], [1, 0], [0, 1], [-1, 0]],\n\t\t\t\t\tstart = half,\n\t\t\t\t\tend = size + 1;\n\t\t\t\tfor (var i = 0; i < 4; i++) {\n\t\t\t\t\tvar delta = deltas[i],\n\t\t\t\t\t\tdx = delta[0],\n\t\t\t\t\t\tdy = delta[1];\n\t\t\t\t\tctx.moveTo(x + dx * start, y + dy * start);\n\t\t\t\t\tctx.lineTo(x + dx * end, y + dy * end);\n\t\t\t\t\tctx.stroke();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (boundsSelected) {\n\t\t\t\tvar coords = mx._transformCorners(this.getInternalBounds());\n\t\t\t\tctx.beginPath();\n\t\t\t\tfor (var i = 0; i < 8; i++) {\n\t\t\t\t\tctx[!i ? 'moveTo' : 'lineTo'](coords[i], coords[++i]);\n\t\t\t\t}\n\t\t\t\tctx.closePath();\n\t\t\t\tctx.stroke();\n\t\t\t\tfor (var i = 0; i < 8; i++) {\n\t\t\t\t\tctx.fillRect(coords[i] - half, coords[++i] - half,\n\t\t\t\t\t\t\tsize, size);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_canComposite: function() {\n\t\treturn false;\n\t}\n}, Base.each(['down', 'drag', 'up', 'move'], function(key) {\n\tthis['removeOn' + Base.capitalize(key)] = function() {\n\t\tvar hash = {};\n\t\thash[key] = true;\n\t\treturn this.removeOn(hash);\n\t};\n}, {\n\n\tremoveOn: function(obj) {\n\t\tfor (var name in obj) {\n\t\t\tif (obj[name]) {\n\t\t\t\tvar key = 'mouse' + name,\n\t\t\t\t\tproject = this._project,\n\t\t\t\t\tsets = project._removeSets = project._removeSets || {};\n\t\t\t\tsets[key] = sets[key] || {};\n\t\t\t\tsets[key][this._id] = this;\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n}), {\n\ttween: function(from, to, options) {\n\t\tif (!options) {\n\t\t\toptions = to;\n\t\t\tto = from;\n\t\t\tfrom = null;\n\t\t\tif (!options) {\n\t\t\t\toptions = to;\n\t\t\t\tto = null;\n\t\t\t}\n\t\t}\n\t\tvar easing = options && options.easing,\n\t\t\tstart = options && options.start,\n\t\t\tduration = options != null && (\n\t\t\t\ttypeof options === 'number' ? options : options.duration\n\t\t\t),\n\t\t\ttween = new Tween(this, from, to, duration, easing, start);\n\t\tfunction onFrame(event) {\n\t\t\ttween._handleFrame(event.time * 1000);\n\t\t\tif (!tween.running) {\n\t\t\t\tthis.off('frame', onFrame);\n\t\t\t}\n\t\t}\n\t\tif (duration) {\n\t\t\tthis.on('frame', onFrame);\n\t\t}\n\t\treturn tween;\n\t},\n\n\ttweenTo: function(to, options) {\n\t\treturn this.tween(null, to, options);\n\t},\n\n\ttweenFrom: function(from, options) {\n\t\treturn this.tween(from, null, options);\n\t}\n});\n\nvar Group = Item.extend({\n\t_class: 'Group',\n\t_selectBounds: false,\n\t_selectChildren: true,\n\t_serializeFields: {\n\t\tchildren: []\n\t},\n\n\tinitialize: function Group(arg) {\n\t\tthis._children = [];\n\t\tthis._namedChildren = {};\n\t\tif (!this._initialize(arg))\n\t\t\tthis.addChildren(Array.isArray(arg) ? arg : arguments);\n\t},\n\n\t_changed: function _changed(flags) {\n\t\t_changed.base.call(this, flags);\n\t\tif (flags & 2050) {\n\t\t\tthis._clipItem = undefined;\n\t\t}\n\t},\n\n\t_getClipItem: function() {\n\t\tvar clipItem = this._clipItem;\n\t\tif (clipItem === undefined) {\n\t\t\tclipItem = null;\n\t\t\tvar children = this._children;\n\t\t\tfor (var i = 0, l = children.length; i < l; i++) {\n\t\t\t\tif (children[i]._clipMask) {\n\t\t\t\t\tclipItem = children[i];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._clipItem = clipItem;\n\t\t}\n\t\treturn clipItem;\n\t},\n\n\tisClipped: function() {\n\t\treturn !!this._getClipItem();\n\t},\n\n\tsetClipped: function(clipped) {\n\t\tvar child = this.getFirstChild();\n\t\tif (child)\n\t\t\tchild.setClipMask(clipped);\n\t},\n\n\t_getBounds: function _getBounds(matrix, options) {\n\t\tvar clipItem = this._getClipItem();\n\t\treturn clipItem\n\t\t\t? clipItem._getCachedBounds(clipItem._matrix.prepended(matrix),\n\t\t\t\tBase.set({}, options, { stroke: false }))\n\t\t\t: _getBounds.base.call(this, matrix, options);\n\t},\n\n\t_hitTestChildren: function _hitTestChildren(point, options, viewMatrix) {\n\t\tvar clipItem = this._getClipItem();\n\t\treturn (!clipItem || clipItem.contains(point))\n\t\t\t\t&& _hitTestChildren.base.call(this, point, options, viewMatrix,\n\t\t\t\t\tclipItem);\n\t},\n\n\t_draw: function(ctx, param) {\n\t\tvar clip = param.clip,\n\t\t\tclipItem = !clip && this._getClipItem();\n\t\tparam = param.extend({ clipItem: clipItem, clip: false });\n\t\tif (clip) {\n\t\t\tctx.beginPath();\n\t\t\tparam.dontStart = param.dontFinish = true;\n\t\t} else if (clipItem) {\n\t\t\tclipItem.draw(ctx, param.extend({ clip: true }));\n\t\t}\n\t\tvar children = this._children;\n\t\tfor (var i = 0, l = children.length; i < l; i++) {\n\t\t\tvar item = children[i];\n\t\t\tif (item !== clipItem)\n\t\t\t\titem.draw(ctx, param);\n\t\t}\n\t}\n});\n\nvar Layer = Group.extend({\n\t_class: 'Layer',\n\n\tinitialize: function Layer() {\n\t\tGroup.apply(this, arguments);\n\t},\n\n\t_getOwner: function() {\n\t\treturn this._parent || this._index != null && this._project;\n\t},\n\n\tisInserted: function isInserted() {\n\t\treturn this._parent ? isInserted.base.call(this) : this._index != null;\n\t},\n\n\tactivate: function() {\n\t\tthis._project._activeLayer = this;\n\t},\n\n\t_hitTestSelf: function() {\n\t}\n});\n\nvar Shape = Item.extend({\n\t_class: 'Shape',\n\t_applyMatrix: false,\n\t_canApplyMatrix: false,\n\t_canScaleStroke: true,\n\t_serializeFields: {\n\t\ttype: null,\n\t\tsize: null,\n\t\tradius: null\n\t},\n\n\tinitialize: function Shape(props, point) {\n\t\tthis._initialize(props, point);\n\t},\n\n\t_equals: function(item) {\n\t\treturn this._type === item._type\n\t\t\t&& this._size.equals(item._size)\n\t\t\t&& Base.equals(this._radius, item._radius);\n\t},\n\n\tcopyContent: function(source) {\n\t\tthis.setType(source._type);\n\t\tthis.setSize(source._size);\n\t\tthis.setRadius(source._radius);\n\t},\n\n\tgetType: function() {\n\t\treturn this._type;\n\t},\n\n\tsetType: function(type) {\n\t\tthis._type = type;\n\t},\n\n\tgetShape: '#getType',\n\tsetShape: '#setType',\n\n\tgetSize: function() {\n\t\tvar size = this._size;\n\t\treturn new LinkedSize(size.width, size.height, this, 'setSize');\n\t},\n\n\tsetSize: function() {\n\t\tvar size = Size.read(arguments);\n\t\tif (!this._size) {\n\t\t\tthis._size = size.clone();\n\t\t} else if (!this._size.equals(size)) {\n\t\t\tvar type = this._type,\n\t\t\t\twidth = size.width,\n\t\t\t\theight = size.height;\n\t\t\tif (type === 'rectangle') {\n\t\t\t\tthis._radius.set(Size.min(this._radius, size.divide(2).abs()));\n\t\t\t} else if (type === 'circle') {\n\t\t\t\twidth = height = (width + height) / 2;\n\t\t\t\tthis._radius = width / 2;\n\t\t\t} else if (type === 'ellipse') {\n\t\t\t\tthis._radius._set(width / 2, height / 2);\n\t\t\t}\n\t\t\tthis._size._set(width, height);\n\t\t\tthis._changed(9);\n\t\t}\n\t},\n\n\tgetRadius: function() {\n\t\tvar rad = this._radius;\n\t\treturn this._type === 'circle'\n\t\t\t\t? rad\n\t\t\t\t: new LinkedSize(rad.width, rad.height, this, 'setRadius');\n\t},\n\n\tsetRadius: function(radius) {\n\t\tvar type = this._type;\n\t\tif (type === 'circle') {\n\t\t\tif (radius === this._radius)\n\t\t\t\treturn;\n\t\t\tvar size = radius * 2;\n\t\t\tthis._radius = radius;\n\t\t\tthis._size._set(size, size);\n\t\t} else {\n\t\t\tradius = Size.read(arguments);\n\t\t\tif (!this._radius) {\n\t\t\t\tthis._radius = radius.clone();\n\t\t\t} else {\n\t\t\t\tif (this._radius.equals(radius))\n\t\t\t\t\treturn;\n\t\t\t\tthis._radius.set(radius);\n\t\t\t\tif (type === 'rectangle') {\n\t\t\t\t\tvar size = Size.max(this._size, radius.multiply(2));\n\t\t\t\t\tthis._size.set(size);\n\t\t\t\t} else if (type === 'ellipse') {\n\t\t\t\t\tthis._size._set(radius.width * 2, radius.height * 2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis._changed(9);\n\t},\n\n\tisEmpty: function() {\n\t\treturn false;\n\t},\n\n\ttoPath: function(insert) {\n\t\tvar path = new Path[Base.capitalize(this._type)]({\n\t\t\tcenter: new Point(),\n\t\t\tsize: this._size,\n\t\t\tradius: this._radius,\n\t\t\tinsert: false\n\t\t});\n\t\tpath.copyAttributes(this);\n\t\tif (paper.settings.applyMatrix)\n\t\t\tpath.setApplyMatrix(true);\n\t\tif (insert === undefined || insert)\n\t\t\tpath.insertAbove(this);\n\t\treturn path;\n\t},\n\n\ttoShape: '#clone',\n\n\t_asPathItem: function() {\n\t\treturn this.toPath(false);\n\t},\n\n\t_draw: function(ctx, param, viewMatrix, strokeMatrix) {\n\t\tvar style = this._style,\n\t\t\thasFill = style.hasFill(),\n\t\t\thasStroke = style.hasStroke(),\n\t\t\tdontPaint = param.dontFinish || param.clip,\n\t\t\tuntransformed = !strokeMatrix;\n\t\tif (hasFill || hasStroke || dontPaint) {\n\t\t\tvar type = this._type,\n\t\t\t\tradius = this._radius,\n\t\t\t\tisCircle = type === 'circle';\n\t\t\tif (!param.dontStart)\n\t\t\t\tctx.beginPath();\n\t\t\tif (untransformed && isCircle) {\n\t\t\t\tctx.arc(0, 0, radius, 0, Math.PI * 2, true);\n\t\t\t} else {\n\t\t\t\tvar rx = isCircle ? radius : radius.width,\n\t\t\t\t\try = isCircle ? radius : radius.height,\n\t\t\t\t\tsize = this._size,\n\t\t\t\t\twidth = size.width,\n\t\t\t\t\theight = size.height;\n\t\t\t\tif (untransformed && type === 'rectangle' && rx === 0 && ry === 0) {\n\t\t\t\t\tctx.rect(-width / 2, -height / 2, width, height);\n\t\t\t\t} else {\n\t\t\t\t\tvar x = width / 2,\n\t\t\t\t\t\ty = height / 2,\n\t\t\t\t\t\tkappa = 1 - 0.5522847498307936,\n\t\t\t\t\t\tcx = rx * kappa,\n\t\t\t\t\t\tcy = ry * kappa,\n\t\t\t\t\t\tc = [\n\t\t\t\t\t\t\t-x, -y + ry,\n\t\t\t\t\t\t\t-x, -y + cy,\n\t\t\t\t\t\t\t-x + cx, -y,\n\t\t\t\t\t\t\t-x + rx, -y,\n\t\t\t\t\t\t\tx - rx, -y,\n\t\t\t\t\t\t\tx - cx, -y,\n\t\t\t\t\t\t\tx, -y + cy,\n\t\t\t\t\t\t\tx, -y + ry,\n\t\t\t\t\t\t\tx, y - ry,\n\t\t\t\t\t\t\tx, y - cy,\n\t\t\t\t\t\t\tx - cx, y,\n\t\t\t\t\t\t\tx - rx, y,\n\t\t\t\t\t\t\t-x + rx, y,\n\t\t\t\t\t\t\t-x + cx, y,\n\t\t\t\t\t\t\t-x, y - cy,\n\t\t\t\t\t\t\t-x, y - ry\n\t\t\t\t\t\t];\n\t\t\t\t\tif (strokeMatrix)\n\t\t\t\t\t\tstrokeMatrix.transform(c, c, 32);\n\t\t\t\t\tctx.moveTo(c[0], c[1]);\n\t\t\t\t\tctx.bezierCurveTo(c[2], c[3], c[4], c[5], c[6], c[7]);\n\t\t\t\t\tif (x !== rx)\n\t\t\t\t\t\tctx.lineTo(c[8], c[9]);\n\t\t\t\t\tctx.bezierCurveTo(c[10], c[11], c[12], c[13], c[14], c[15]);\n\t\t\t\t\tif (y !== ry)\n\t\t\t\t\t\tctx.lineTo(c[16], c[17]);\n\t\t\t\t\tctx.bezierCurveTo(c[18], c[19], c[20], c[21], c[22], c[23]);\n\t\t\t\t\tif (x !== rx)\n\t\t\t\t\t\tctx.lineTo(c[24], c[25]);\n\t\t\t\t\tctx.bezierCurveTo(c[26], c[27], c[28], c[29], c[30], c[31]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tctx.closePath();\n\t\t}\n\t\tif (!dontPaint && (hasFill || hasStroke)) {\n\t\t\tthis._setStyles(ctx, param, viewMatrix);\n\t\t\tif (hasFill) {\n\t\t\t\tctx.fill(style.getFillRule());\n\t\t\t\tctx.shadowColor = 'rgba(0,0,0,0)';\n\t\t\t}\n\t\t\tif (hasStroke)\n\t\t\t\tctx.stroke();\n\t\t}\n\t},\n\n\t_canComposite: function() {\n\t\treturn !(this.hasFill() && this.hasStroke());\n\t},\n\n\t_getBounds: function(matrix, options) {\n\t\tvar rect = new Rectangle(this._size).setCenter(0, 0),\n\t\t\tstyle = this._style,\n\t\t\tstrokeWidth = options.stroke && style.hasStroke()\n\t\t\t\t\t&& style.getStrokeWidth();\n\t\tif (matrix)\n\t\t\trect = matrix._transformBounds(rect);\n\t\treturn strokeWidth\n\t\t\t\t? rect.expand(Path._getStrokePadding(strokeWidth,\n\t\t\t\t\tthis._getStrokeMatrix(matrix, options)))\n\t\t\t\t: rect;\n\t}\n},\nnew function() {\n\tfunction getCornerCenter(that, point, expand) {\n\t\tvar radius = that._radius;\n\t\tif (!radius.isZero()) {\n\t\t\tvar halfSize = that._size.divide(2);\n\t\t\tfor (var q = 1; q <= 4; q++) {\n\t\t\t\tvar dir = new Point(q > 1 && q < 4 ? -1 : 1, q > 2 ? -1 : 1),\n\t\t\t\t\tcorner = dir.multiply(halfSize),\n\t\t\t\t\tcenter = corner.subtract(dir.multiply(radius)),\n\t\t\t\t\trect = new Rectangle(\n\t\t\t\t\t\t\texpand ? corner.add(dir.multiply(expand)) : corner,\n\t\t\t\t\t\t\tcenter);\n\t\t\t\tif (rect.contains(point))\n\t\t\t\t\treturn { point: center, quadrant: q };\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction isOnEllipseStroke(point, radius, padding, quadrant) {\n\t\tvar vector = point.divide(radius);\n\t\treturn (!quadrant || vector.isInQuadrant(quadrant)) &&\n\t\t\t\tvector.subtract(vector.normalize()).multiply(radius)\n\t\t\t\t\t.divide(padding).length <= 1;\n\t}\n\n\treturn {\n\t\t_contains: function _contains(point) {\n\t\t\tif (this._type === 'rectangle') {\n\t\t\t\tvar center = getCornerCenter(this, point);\n\t\t\t\treturn center\n\t\t\t\t\t\t? point.subtract(center.point).divide(this._radius)\n\t\t\t\t\t\t\t.getLength() <= 1\n\t\t\t\t\t\t: _contains.base.call(this, point);\n\t\t\t} else {\n\t\t\t\treturn point.divide(this.size).getLength() <= 0.5;\n\t\t\t}\n\t\t},\n\n\t\t_hitTestSelf: function _hitTestSelf(point, options, viewMatrix,\n\t\t\t\tstrokeMatrix) {\n\t\t\tvar hit = false,\n\t\t\t\tstyle = this._style,\n\t\t\t\thitStroke = options.stroke && style.hasStroke(),\n\t\t\t\thitFill = options.fill && style.hasFill();\n\t\t\tif (hitStroke || hitFill) {\n\t\t\t\tvar type = this._type,\n\t\t\t\t\tradius = this._radius,\n\t\t\t\t\tstrokeRadius = hitStroke ? style.getStrokeWidth() / 2 : 0,\n\t\t\t\t\tstrokePadding = options._tolerancePadding.add(\n\t\t\t\t\t\tPath._getStrokePadding(strokeRadius,\n\t\t\t\t\t\t\t!style.getStrokeScaling() && strokeMatrix));\n\t\t\t\tif (type === 'rectangle') {\n\t\t\t\t\tvar padding = strokePadding.multiply(2),\n\t\t\t\t\t\tcenter = getCornerCenter(this, point, padding);\n\t\t\t\t\tif (center) {\n\t\t\t\t\t\thit = isOnEllipseStroke(point.subtract(center.point),\n\t\t\t\t\t\t\t\tradius, strokePadding, center.quadrant);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar rect = new Rectangle(this._size).setCenter(0, 0),\n\t\t\t\t\t\t\touter = rect.expand(padding),\n\t\t\t\t\t\t\tinner = rect.expand(padding.negate());\n\t\t\t\t\t\thit = outer._containsPoint(point)\n\t\t\t\t\t\t\t\t&& !inner._containsPoint(point);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\thit = isOnEllipseStroke(point, radius, strokePadding);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn hit ? new HitResult(hitStroke ? 'stroke' : 'fill', this)\n\t\t\t\t\t: _hitTestSelf.base.apply(this, arguments);\n\t\t}\n\t};\n}, {\n\nstatics: new function() {\n\tfunction createShape(type, point, size, radius, args) {\n\t\tvar item = Base.create(Shape.prototype);\n\t\titem._type = type;\n\t\titem._size = size;\n\t\titem._radius = radius;\n\t\titem._initialize(Base.getNamed(args), point);\n\t\treturn item;\n\t}\n\n\treturn {\n\t\tCircle: function() {\n\t\t\tvar args = arguments,\n\t\t\t\tcenter = Point.readNamed(args, 'center'),\n\t\t\t\tradius = Base.readNamed(args, 'radius');\n\t\t\treturn createShape('circle', center, new Size(radius * 2), radius,\n\t\t\t\t\targs);\n\t\t},\n\n\t\tRectangle: function() {\n\t\t\tvar args = arguments,\n\t\t\t\trect = Rectangle.readNamed(args, 'rectangle'),\n\t\t\t\tradius = Size.min(Size.readNamed(args, 'radius'),\n\t\t\t\t\t\trect.getSize(true).divide(2));\n\t\t\treturn createShape('rectangle', rect.getCenter(true),\n\t\t\t\t\trect.getSize(true), radius, args);\n\t\t},\n\n\t\tEllipse: function() {\n\t\t\tvar args = arguments,\n\t\t\t\tellipse = Shape._readEllipse(args),\n\t\t\t\tradius = ellipse.radius;\n\t\t\treturn createShape('ellipse', ellipse.center, radius.multiply(2),\n\t\t\t\t\tradius, args);\n\t\t},\n\n\t\t_readEllipse: function(args) {\n\t\t\tvar center,\n\t\t\t\tradius;\n\t\t\tif (Base.hasNamed(args, 'radius')) {\n\t\t\t\tcenter = Point.readNamed(args, 'center');\n\t\t\t\tradius = Size.readNamed(args, 'radius');\n\t\t\t} else {\n\t\t\t\tvar rect = Rectangle.readNamed(args, 'rectangle');\n\t\t\t\tcenter = rect.getCenter(true);\n\t\t\t\tradius = rect.getSize(true).divide(2);\n\t\t\t}\n\t\t\treturn { center: center, radius: radius };\n\t\t}\n\t};\n}});\n\nvar Raster = Item.extend({\n\t_class: 'Raster',\n\t_applyMatrix: false,\n\t_canApplyMatrix: false,\n\t_boundsOptions: { stroke: false, handle: false },\n\t_serializeFields: {\n\t\tcrossOrigin: null,\n\t\tsource: null\n\t},\n\t_prioritize: ['crossOrigin'],\n\t_smoothing: 'low',\n\tbeans: true,\n\n\tinitialize: function Raster(source, position) {\n\t\tif (!this._initialize(source,\n\t\t\t\tposition !== undefined && Point.read(arguments))) {\n\t\t\tvar image,\n\t\t\t\ttype = typeof source,\n\t\t\t\tobject = type === 'string'\n\t\t\t\t\t? document.getElementById(source)\n\t\t\t\t\t: type === 'object'\n\t\t\t\t\t\t? source\n\t\t\t\t\t\t: null;\n\t\t\tif (object && object !== Item.NO_INSERT) {\n\t\t\t\tif (object.getContext || object.naturalHeight != null) {\n\t\t\t\t\timage = object;\n\t\t\t\t} else if (object) {\n\t\t\t\t\tvar size = Size.read(arguments);\n\t\t\t\t\tif (!size.isZero()) {\n\t\t\t\t\t\timage = CanvasProvider.getCanvas(size);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (image) {\n\t\t\t\tthis.setImage(image);\n\t\t\t} else {\n\t\t\t\tthis.setSource(source);\n\t\t\t}\n\t\t}\n\t\tif (!this._size) {\n\t\t\tthis._size = new Size();\n\t\t\tthis._loaded = false;\n\t\t}\n\t},\n\n\t_equals: function(item) {\n\t\treturn this.getSource() === item.getSource();\n\t},\n\n\tcopyContent: function(source) {\n\t\tvar image = source._image,\n\t\t\tcanvas = source._canvas;\n\t\tif (image) {\n\t\t\tthis._setImage(image);\n\t\t} else if (canvas) {\n\t\t\tvar copyCanvas = CanvasProvider.getCanvas(source._size);\n\t\t\tcopyCanvas.getContext('2d').drawImage(canvas, 0, 0);\n\t\t\tthis._setImage(copyCanvas);\n\t\t}\n\t\tthis._crossOrigin = source._crossOrigin;\n\t},\n\n\tgetSize: function() {\n\t\tvar size = this._size;\n\t\treturn new LinkedSize(size ? size.width : 0, size ? size.height : 0,\n\t\t\t\tthis, 'setSize');\n\t},\n\n\tsetSize: function(_size, _clear) {\n\t\tvar size = Size.read(arguments);\n\t\tif (!size.equals(this._size)) {\n\t\t\tif (size.width > 0 && size.height > 0) {\n\t\t\t\tvar element = !_clear && this.getElement();\n\t\t\t\tthis._setImage(CanvasProvider.getCanvas(size));\n\t\t\t\tif (element) {\n\t\t\t\t\tthis.getContext(true).drawImage(element, 0, 0,\n\t\t\t\t\t\t\tsize.width, size.height);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this._canvas)\n\t\t\t\t\tCanvasProvider.release(this._canvas);\n\t\t\t\tthis._size = size.clone();\n\t\t\t}\n\t\t} else if (_clear) {\n\t\t\tthis.clear();\n\t\t}\n\t},\n\n\tgetWidth: function() {\n\t\treturn this._size ? this._size.width : 0;\n\t},\n\n\tsetWidth: function(width) {\n\t\tthis.setSize(width, this.getHeight());\n\t},\n\n\tgetHeight: function() {\n\t\treturn this._size ? this._size.height : 0;\n\t},\n\n\tsetHeight: function(height) {\n\t\tthis.setSize(this.getWidth(), height);\n\t},\n\n\tgetLoaded: function() {\n\t\treturn this._loaded;\n\t},\n\n\tisEmpty: function() {\n\t\tvar size = this._size;\n\t\treturn !size || size.width === 0 && size.height === 0;\n\t},\n\n\tgetResolution: function() {\n\t\tvar matrix = this._matrix,\n\t\t\torig = new Point(0, 0).transform(matrix),\n\t\t\tu = new Point(1, 0).transform(matrix).subtract(orig),\n\t\t\tv = new Point(0, 1).transform(matrix).subtract(orig);\n\t\treturn new Size(\n\t\t\t72 / u.getLength(),\n\t\t\t72 / v.getLength()\n\t\t);\n\t},\n\n\tgetPpi: '#getResolution',\n\n\tgetImage: function() {\n\t\treturn this._image;\n\t},\n\n\tsetImage: function(image) {\n\t\tvar that = this;\n\n\t\tfunction emit(event) {\n\t\t\tvar view = that.getView(),\n\t\t\t\ttype = event && event.type || 'load';\n\t\t\tif (view && that.responds(type)) {\n\t\t\t\tpaper = view._scope;\n\t\t\t\tthat.emit(type, new Event(event));\n\t\t\t}\n\t\t}\n\n\t\tthis._setImage(image);\n\t\tif (this._loaded) {\n\t\t\tsetTimeout(emit, 0);\n\t\t} else if (image) {\n\t\t\tDomEvent.add(image, {\n\t\t\t\tload: function(event) {\n\t\t\t\t\tthat._setImage(image);\n\t\t\t\t\temit(event);\n\t\t\t\t},\n\t\t\t\terror: emit\n\t\t\t});\n\t\t}\n\t},\n\n\t_setImage: function(image) {\n\t\tif (this._canvas)\n\t\t\tCanvasProvider.release(this._canvas);\n\t\tif (image && image.getContext) {\n\t\t\tthis._image = null;\n\t\t\tthis._canvas = image;\n\t\t\tthis._loaded = true;\n\t\t} else {\n\t\t\tthis._image = image;\n\t\t\tthis._canvas = null;\n\t\t\tthis._loaded = !!(image && image.src && image.complete);\n\t\t}\n\t\tthis._size = new Size(\n\t\t\t\timage ? image.naturalWidth || image.width : 0,\n\t\t\t\timage ? image.naturalHeight || image.height : 0);\n\t\tthis._context = null;\n\t\tthis._changed(1033);\n\t},\n\n\tgetCanvas: function() {\n\t\tif (!this._canvas) {\n\t\t\tvar ctx = CanvasProvider.getContext(this._size);\n\t\t\ttry {\n\t\t\t\tif (this._image)\n\t\t\t\t\tctx.drawImage(this._image, 0, 0);\n\t\t\t\tthis._canvas = ctx.canvas;\n\t\t\t} catch (e) {\n\t\t\t\tCanvasProvider.release(ctx);\n\t\t\t}\n\t\t}\n\t\treturn this._canvas;\n\t},\n\n\tsetCanvas: '#setImage',\n\n\tgetContext: function(_change) {\n\t\tif (!this._context)\n\t\t\tthis._context = this.getCanvas().getContext('2d');\n\t\tif (_change) {\n\t\t\tthis._image = null;\n\t\t\tthis._changed(1025);\n\t\t}\n\t\treturn this._context;\n\t},\n\n\tsetContext: function(context) {\n\t\tthis._context = context;\n\t},\n\n\tgetSource: function() {\n\t\tvar image = this._image;\n\t\treturn image && image.src || this.toDataURL();\n\t},\n\n\tsetSource: function(src) {\n\t\tvar image = new self.Image(),\n\t\t\tcrossOrigin = this._crossOrigin;\n\t\tif (crossOrigin)\n\t\t\timage.crossOrigin = crossOrigin;\n\t\tif (src)\n\t\t\timage.src = src;\n\t\tthis.setImage(image);\n\t},\n\n\tgetCrossOrigin: function() {\n\t\tvar image = this._image;\n\t\treturn image && image.crossOrigin || this._crossOrigin || '';\n\t},\n\n\tsetCrossOrigin: function(crossOrigin) {\n\t\tthis._crossOrigin = crossOrigin;\n\t\tvar image = this._image;\n\t\tif (image)\n\t\t\timage.crossOrigin = crossOrigin;\n\t},\n\n\tgetSmoothing: function() {\n\t\treturn this._smoothing;\n\t},\n\n\tsetSmoothing: function(smoothing) {\n\t\tthis._smoothing = typeof smoothing === 'string'\n\t\t\t? smoothing\n\t\t\t: smoothing ? 'low' : 'off';\n\t\tthis._changed(257);\n\t},\n\n\tgetElement: function() {\n\t\treturn this._canvas || this._loaded && this._image;\n\t}\n}, {\n\tbeans: false,\n\n\tgetSubCanvas: function() {\n\t\tvar rect = Rectangle.read(arguments),\n\t\t\tctx = CanvasProvider.getContext(rect.getSize());\n\t\tctx.drawImage(this.getCanvas(), rect.x, rect.y,\n\t\t\t\trect.width, rect.height, 0, 0, rect.width, rect.height);\n\t\treturn ctx.canvas;\n\t},\n\n\tgetSubRaster: function() {\n\t\tvar rect = Rectangle.read(arguments),\n\t\t\traster = new Raster(Item.NO_INSERT);\n\t\traster._setImage(this.getSubCanvas(rect));\n\t\traster.translate(rect.getCenter().subtract(this.getSize().divide(2)));\n\t\traster._matrix.prepend(this._matrix);\n\t\traster.insertAbove(this);\n\t\treturn raster;\n\t},\n\n\ttoDataURL: function() {\n\t\tvar image = this._image,\n\t\t\tsrc = image && image.src;\n\t\tif (/^data:/.test(src))\n\t\t\treturn src;\n\t\tvar canvas = this.getCanvas();\n\t\treturn canvas ? canvas.toDataURL.apply(canvas, arguments) : null;\n\t},\n\n\tdrawImage: function(image ) {\n\t\tvar point = Point.read(arguments, 1);\n\t\tthis.getContext(true).drawImage(image, point.x, point.y);\n\t},\n\n\tgetAverageColor: function(object) {\n\t\tvar bounds, path;\n\t\tif (!object) {\n\t\t\tbounds = this.getBounds();\n\t\t} else if (object instanceof PathItem) {\n\t\t\tpath = object;\n\t\t\tbounds = object.getBounds();\n\t\t} else if (typeof object === 'object') {\n\t\t\tif ('width' in object) {\n\t\t\t\tbounds = new Rectangle(object);\n\t\t\t} else if ('x' in object) {\n\t\t\t\tbounds = new Rectangle(object.x - 0.5, object.y - 0.5, 1, 1);\n\t\t\t}\n\t\t}\n\t\tif (!bounds)\n\t\t\treturn null;\n\t\tvar sampleSize = 32,\n\t\t\twidth = Math.min(bounds.width, sampleSize),\n\t\t\theight = Math.min(bounds.height, sampleSize);\n\t\tvar ctx = Raster._sampleContext;\n\t\tif (!ctx) {\n\t\t\tctx = Raster._sampleContext = CanvasProvider.getContext(\n\t\t\t\t\tnew Size(sampleSize));\n\t\t} else {\n\t\t\tctx.clearRect(0, 0, sampleSize + 1, sampleSize + 1);\n\t\t}\n\t\tctx.save();\n\t\tvar matrix = new Matrix()\n\t\t\t\t.scale(width / bounds.width, height / bounds.height)\n\t\t\t\t.translate(-bounds.x, -bounds.y);\n\t\tmatrix.applyToContext(ctx);\n\t\tif (path)\n\t\t\tpath.draw(ctx, new Base({ clip: true, matrices: [matrix] }));\n\t\tthis._matrix.applyToContext(ctx);\n\t\tvar element = this.getElement(),\n\t\t\tsize = this._size;\n\t\tif (element)\n\t\t\tctx.drawImage(element, -size.width / 2, -size.height / 2);\n\t\tctx.restore();\n\t\tvar pixels = ctx.getImageData(0.5, 0.5, Math.ceil(width),\n\t\t\t\tMath.ceil(height)).data,\n\t\t\tchannels = [0, 0, 0],\n\t\t\ttotal = 0;\n\t\tfor (var i = 0, l = pixels.length; i < l; i += 4) {\n\t\t\tvar alpha = pixels[i + 3];\n\t\t\ttotal += alpha;\n\t\t\talpha /= 255;\n\t\t\tchannels[0] += pixels[i] * alpha;\n\t\t\tchannels[1] += pixels[i + 1] * alpha;\n\t\t\tchannels[2] += pixels[i + 2] * alpha;\n\t\t}\n\t\tfor (var i = 0; i < 3; i++)\n\t\t\tchannels[i] /= total;\n\t\treturn total ? Color.read(channels) : null;\n\t},\n\n\tgetPixel: function() {\n\t\tvar point = Point.read(arguments);\n\t\tvar data = this.getContext().getImageData(point.x, point.y, 1, 1).data;\n\t\treturn new Color('rgb', [data[0] / 255, data[1] / 255, data[2] / 255],\n\t\t\t\tdata[3] / 255);\n\t},\n\n\tsetPixel: function() {\n\t\tvar args = arguments,\n\t\t\tpoint = Point.read(args),\n\t\t\tcolor = Color.read(args),\n\t\t\tcomponents = color._convert('rgb'),\n\t\t\talpha = color._alpha,\n\t\t\tctx = this.getContext(true),\n\t\t\timageData = ctx.createImageData(1, 1),\n\t\t\tdata = imageData.data;\n\t\tdata[0] = components[0] * 255;\n\t\tdata[1] = components[1] * 255;\n\t\tdata[2] = components[2] * 255;\n\t\tdata[3] = alpha != null ? alpha * 255 : 255;\n\t\tctx.putImageData(imageData, point.x, point.y);\n\t},\n\n\tclear: function() {\n\t\tvar size = this._size;\n\t\tthis.getContext(true).clearRect(0, 0, size.width + 1, size.height + 1);\n\t},\n\n\tcreateImageData: function() {\n\t\tvar size = Size.read(arguments);\n\t\treturn this.getContext().createImageData(size.width, size.height);\n\t},\n\n\tgetImageData: function() {\n\t\tvar rect = Rectangle.read(arguments);\n\t\tif (rect.isEmpty())\n\t\t\trect = new Rectangle(this._size);\n\t\treturn this.getContext().getImageData(rect.x, rect.y,\n\t\t\t\trect.width, rect.height);\n\t},\n\n\tputImageData: function(data ) {\n\t\tvar point = Point.read(arguments, 1);\n\t\tthis.getContext(true).putImageData(data, point.x, point.y);\n\t},\n\n\tsetImageData: function(data) {\n\t\tthis.setSize(data);\n\t\tthis.getContext(true).putImageData(data, 0, 0);\n\t},\n\n\t_getBounds: function(matrix, options) {\n\t\tvar rect = new Rectangle(this._size).setCenter(0, 0);\n\t\treturn matrix ? matrix._transformBounds(rect) : rect;\n\t},\n\n\t_hitTestSelf: function(point) {\n\t\tif (this._contains(point)) {\n\t\t\tvar that = this;\n\t\t\treturn new HitResult('pixel', that, {\n\t\t\t\toffset: point.add(that._size.divide(2)).round(),\n\t\t\t\tcolor: {\n\t\t\t\t\tget: function() {\n\t\t\t\t\t\treturn that.getPixel(this.offset);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\t_draw: function(ctx, param, viewMatrix) {\n\t\tvar element = this.getElement();\n\t\tif (element && element.width > 0 && element.height > 0) {\n\t\t\tctx.globalAlpha = Numerical.clamp(this._opacity, 0, 1);\n\n\t\t\tthis._setStyles(ctx, param, viewMatrix);\n\n\t\t\tvar smoothing = this._smoothing,\n\t\t\t\tdisabled = smoothing === 'off';\n\t\t\tDomElement.setPrefixed(\n\t\t\t\tctx,\n\t\t\t\tdisabled ? 'imageSmoothingEnabled' : 'imageSmoothingQuality',\n\t\t\t\tdisabled ? false : smoothing\n\t\t\t);\n\n\t\t\tctx.drawImage(element,\n\t\t\t\t\t-this._size.width / 2, -this._size.height / 2);\n\t\t}\n\t},\n\n\t_canComposite: function() {\n\t\treturn true;\n\t}\n});\n\nvar SymbolItem = Item.extend({\n\t_class: 'SymbolItem',\n\t_applyMatrix: false,\n\t_canApplyMatrix: false,\n\t_boundsOptions: { stroke: true },\n\t_serializeFields: {\n\t\tsymbol: null\n\t},\n\n\tinitialize: function SymbolItem(arg0, arg1) {\n\t\tif (!this._initialize(arg0,\n\t\t\t\targ1 !== undefined && Point.read(arguments, 1)))\n\t\t\tthis.setDefinition(arg0 instanceof SymbolDefinition ?\n\t\t\t\t\targ0 : new SymbolDefinition(arg0));\n\t},\n\n\t_equals: function(item) {\n\t\treturn this._definition === item._definition;\n\t},\n\n\tcopyContent: function(source) {\n\t\tthis.setDefinition(source._definition);\n\t},\n\n\tgetDefinition: function() {\n\t\treturn this._definition;\n\t},\n\n\tsetDefinition: function(definition) {\n\t\tthis._definition = definition;\n\t\tthis._changed(9);\n\t},\n\n\tgetSymbol: '#getDefinition',\n\tsetSymbol: '#setDefinition',\n\n\tisEmpty: function() {\n\t\treturn this._definition._item.isEmpty();\n\t},\n\n\t_getBounds: function(matrix, options) {\n\t\tvar item = this._definition._item;\n\t\treturn item._getCachedBounds(item._matrix.prepended(matrix), options);\n\t},\n\n\t_hitTestSelf: function(point, options, viewMatrix) {\n\t\tvar opts = options.extend({ all: false });\n\t\tvar res = this._definition._item._hitTest(point, opts, viewMatrix);\n\t\tif (res)\n\t\t\tres.item = this;\n\t\treturn res;\n\t},\n\n\t_draw: function(ctx, param) {\n\t\tthis._definition._item.draw(ctx, param);\n\t}\n\n});\n\nvar SymbolDefinition = Base.extend({\n\t_class: 'SymbolDefinition',\n\n\tinitialize: function SymbolDefinition(item, dontCenter) {\n\t\tthis._id = UID.get();\n\t\tthis.project = paper.project;\n\t\tif (item)\n\t\t\tthis.setItem(item, dontCenter);\n\t},\n\n\t_serialize: function(options, dictionary) {\n\t\treturn dictionary.add(this, function() {\n\t\t\treturn Base.serialize([this._class, this._item],\n\t\t\t\t\toptions, false, dictionary);\n\t\t});\n\t},\n\n\t_changed: function(flags) {\n\t\tif (flags & 8)\n\t\t\tItem._clearBoundsCache(this);\n\t\tif (flags & 1)\n\t\t\tthis.project._changed(flags);\n\t},\n\n\tgetItem: function() {\n\t\treturn this._item;\n\t},\n\n\tsetItem: function(item, _dontCenter) {\n\t\tif (item._symbol)\n\t\t\titem = item.clone();\n\t\tif (this._item)\n\t\t\tthis._item._symbol = null;\n\t\tthis._item = item;\n\t\titem.remove();\n\t\titem.setSelected(false);\n\t\tif (!_dontCenter)\n\t\t\titem.setPosition(new Point());\n\t\titem._symbol = this;\n\t\tthis._changed(9);\n\t},\n\n\tgetDefinition: '#getItem',\n\tsetDefinition: '#setItem',\n\n\tplace: function(position) {\n\t\treturn new SymbolItem(this, position);\n\t},\n\n\tclone: function() {\n\t\treturn new SymbolDefinition(this._item.clone(false));\n\t},\n\n\tequals: function(symbol) {\n\t\treturn symbol === this\n\t\t\t\t|| symbol && this._item.equals(symbol._item)\n\t\t\t\t|| false;\n\t}\n});\n\nvar HitResult = Base.extend({\n\t_class: 'HitResult',\n\n\tinitialize: function HitResult(type, item, values) {\n\t\tthis.type = type;\n\t\tthis.item = item;\n\t\tif (values)\n\t\t\tthis.inject(values);\n\t},\n\n\tstatics: {\n\t\tgetOptions: function(args) {\n\t\t\tvar options = args && Base.read(args);\n\t\t\treturn new Base({\n\t\t\t\ttype: null,\n\t\t\t\ttolerance: paper.settings.hitTolerance,\n\t\t\t\tfill: !options,\n\t\t\t\tstroke: !options,\n\t\t\t\tsegments: !options,\n\t\t\t\thandles: false,\n\t\t\t\tends: false,\n\t\t\t\tposition: false,\n\t\t\t\tcenter: false,\n\t\t\t\tbounds: false,\n\t\t\t\tguides: false,\n\t\t\t\tselected: false\n\t\t\t}, options);\n\t\t}\n\t}\n});\n\nvar Segment = Base.extend({\n\t_class: 'Segment',\n\tbeans: true,\n\t_selection: 0,\n\n\tinitialize: function Segment(arg0, arg1, arg2, arg3, arg4, arg5) {\n\t\tvar count = arguments.length,\n\t\t\tpoint, handleIn, handleOut, selection;\n\t\tif (count > 0) {\n\t\t\tif (arg0 == null || typeof arg0 === 'object') {\n\t\t\t\tif (count === 1 && arg0 && 'point' in arg0) {\n\t\t\t\t\tpoint = arg0.point;\n\t\t\t\t\thandleIn = arg0.handleIn;\n\t\t\t\t\thandleOut = arg0.handleOut;\n\t\t\t\t\tselection = arg0.selection;\n\t\t\t\t} else {\n\t\t\t\t\tpoint = arg0;\n\t\t\t\t\thandleIn = arg1;\n\t\t\t\t\thandleOut = arg2;\n\t\t\t\t\tselection = arg3;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpoint = [ arg0, arg1 ];\n\t\t\t\thandleIn = arg2 !== undefined ? [ arg2, arg3 ] : null;\n\t\t\t\thandleOut = arg4 !== undefined ? [ arg4, arg5 ] : null;\n\t\t\t}\n\t\t}\n\t\tnew SegmentPoint(point, this, '_point');\n\t\tnew SegmentPoint(handleIn, this, '_handleIn');\n\t\tnew SegmentPoint(handleOut, this, '_handleOut');\n\t\tif (selection)\n\t\t\tthis.setSelection(selection);\n\t},\n\n\t_serialize: function(options, dictionary) {\n\t\tvar point = this._point,\n\t\t\tselection = this._selection,\n\t\t\tobj = selection || this.hasHandles()\n\t\t\t\t\t? [point, this._handleIn, this._handleOut]\n\t\t\t\t\t: point;\n\t\tif (selection)\n\t\t\tobj.push(selection);\n\t\treturn Base.serialize(obj, options, true, dictionary);\n\t},\n\n\t_changed: function(point) {\n\t\tvar path = this._path;\n\t\tif (!path)\n\t\t\treturn;\n\t\tvar curves = path._curves,\n\t\t\tindex = this._index,\n\t\t\tcurve;\n\t\tif (curves) {\n\t\t\tif ((!point || point === this._point || point === this._handleIn)\n\t\t\t\t\t&& (curve = index > 0 ? curves[index - 1] : path._closed\n\t\t\t\t\t\t? curves[curves.length - 1] : null))\n\t\t\t\tcurve._changed();\n\t\t\tif ((!point || point === this._point || point === this._handleOut)\n\t\t\t\t\t&& (curve = curves[index]))\n\t\t\t\tcurve._changed();\n\t\t}\n\t\tpath._changed(41);\n\t},\n\n\tgetPoint: function() {\n\t\treturn this._point;\n\t},\n\n\tsetPoint: function() {\n\t\tthis._point.set(Point.read(arguments));\n\t},\n\n\tgetHandleIn: function() {\n\t\treturn this._handleIn;\n\t},\n\n\tsetHandleIn: function() {\n\t\tthis._handleIn.set(Point.read(arguments));\n\t},\n\n\tgetHandleOut: function() {\n\t\treturn this._handleOut;\n\t},\n\n\tsetHandleOut: function() {\n\t\tthis._handleOut.set(Point.read(arguments));\n\t},\n\n\thasHandles: function() {\n\t\treturn !this._handleIn.isZero() || !this._handleOut.isZero();\n\t},\n\n\tisSmooth: function() {\n\t\tvar handleIn = this._handleIn,\n\t\t\thandleOut = this._handleOut;\n\t\treturn !handleIn.isZero() && !handleOut.isZero()\n\t\t\t\t&& handleIn.isCollinear(handleOut);\n\t},\n\n\tclearHandles: function() {\n\t\tthis._handleIn._set(0, 0);\n\t\tthis._handleOut._set(0, 0);\n\t},\n\n\tgetSelection: function() {\n\t\treturn this._selection;\n\t},\n\n\tsetSelection: function(selection) {\n\t\tvar oldSelection = this._selection,\n\t\t\tpath = this._path;\n\t\tthis._selection = selection = selection || 0;\n\t\tif (path && selection !== oldSelection) {\n\t\t\tpath._updateSelection(this, oldSelection, selection);\n\t\t\tpath._changed(257);\n\t\t}\n\t},\n\n\t_changeSelection: function(flag, selected) {\n\t\tvar selection = this._selection;\n\t\tthis.setSelection(selected ? selection | flag : selection & ~flag);\n\t},\n\n\tisSelected: function() {\n\t\treturn !!(this._selection & 7);\n\t},\n\n\tsetSelected: function(selected) {\n\t\tthis._changeSelection(7, selected);\n\t},\n\n\tgetIndex: function() {\n\t\treturn this._index !== undefined ? this._index : null;\n\t},\n\n\tgetPath: function() {\n\t\treturn this._path || null;\n\t},\n\n\tgetCurve: function() {\n\t\tvar path = this._path,\n\t\t\tindex = this._index;\n\t\tif (path) {\n\t\t\tif (index > 0 && !path._closed\n\t\t\t\t\t&& index === path._segments.length - 1)\n\t\t\t\tindex--;\n\t\t\treturn path.getCurves()[index] || null;\n\t\t}\n\t\treturn null;\n\t},\n\n\tgetLocation: function() {\n\t\tvar curve = this.getCurve();\n\t\treturn curve\n\t\t\t\t? new CurveLocation(curve, this === curve._segment1 ? 0 : 1)\n\t\t\t\t: null;\n\t},\n\n\tgetNext: function() {\n\t\tvar segments = this._path && this._path._segments;\n\t\treturn segments && (segments[this._index + 1]\n\t\t\t\t|| this._path._closed && segments[0]) || null;\n\t},\n\n\tsmooth: function(options, _first, _last) {\n\t\tvar opts = options || {},\n\t\t\ttype = opts.type,\n\t\t\tfactor = opts.factor,\n\t\t\tprev = this.getPrevious(),\n\t\t\tnext = this.getNext(),\n\t\t\tp0 = (prev || this)._point,\n\t\t\tp1 = this._point,\n\t\t\tp2 = (next || this)._point,\n\t\t\td1 = p0.getDistance(p1),\n\t\t\td2 = p1.getDistance(p2);\n\t\tif (!type || type === 'catmull-rom') {\n\t\t\tvar a = factor === undefined ? 0.5 : factor,\n\t\t\t\td1_a = Math.pow(d1, a),\n\t\t\t\td1_2a = d1_a * d1_a,\n\t\t\t\td2_a = Math.pow(d2, a),\n\t\t\t\td2_2a = d2_a * d2_a;\n\t\t\tif (!_first && prev) {\n\t\t\t\tvar A = 2 * d2_2a + 3 * d2_a * d1_a + d1_2a,\n\t\t\t\t\tN = 3 * d2_a * (d2_a + d1_a);\n\t\t\t\tthis.setHandleIn(N !== 0\n\t\t\t\t\t? new Point(\n\t\t\t\t\t\t(d2_2a * p0._x + A * p1._x - d1_2a * p2._x) / N - p1._x,\n\t\t\t\t\t\t(d2_2a * p0._y + A * p1._y - d1_2a * p2._y) / N - p1._y)\n\t\t\t\t\t: new Point());\n\t\t\t}\n\t\t\tif (!_last && next) {\n\t\t\t\tvar A = 2 * d1_2a + 3 * d1_a * d2_a + d2_2a,\n\t\t\t\t\tN = 3 * d1_a * (d1_a + d2_a);\n\t\t\t\tthis.setHandleOut(N !== 0\n\t\t\t\t\t? new Point(\n\t\t\t\t\t\t(d1_2a * p2._x + A * p1._x - d2_2a * p0._x) / N - p1._x,\n\t\t\t\t\t\t(d1_2a * p2._y + A * p1._y - d2_2a * p0._y) / N - p1._y)\n\t\t\t\t\t: new Point());\n\t\t\t}\n\t\t} else if (type === 'geometric') {\n\t\t\tif (prev && next) {\n\t\t\t\tvar vector = p0.subtract(p2),\n\t\t\t\t\tt = factor === undefined ? 0.4 : factor,\n\t\t\t\t\tk = t * d1 / (d1 + d2);\n\t\t\t\tif (!_first)\n\t\t\t\t\tthis.setHandleIn(vector.multiply(k));\n\t\t\t\tif (!_last)\n\t\t\t\t\tthis.setHandleOut(vector.multiply(k - t));\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error('Smoothing method \\'' + type + '\\' not supported.');\n\t\t}\n\t},\n\n\tgetPrevious: function() {\n\t\tvar segments = this._path && this._path._segments;\n\t\treturn segments && (segments[this._index - 1]\n\t\t\t\t|| this._path._closed && segments[segments.length - 1]) || null;\n\t},\n\n\tisFirst: function() {\n\t\treturn !this._index;\n\t},\n\n\tisLast: function() {\n\t\tvar path = this._path;\n\t\treturn path && this._index === path._segments.length - 1 || false;\n\t},\n\n\treverse: function() {\n\t\tvar handleIn = this._handleIn,\n\t\t\thandleOut = this._handleOut,\n\t\t\ttmp = handleIn.clone();\n\t\thandleIn.set(handleOut);\n\t\thandleOut.set(tmp);\n\t},\n\n\treversed: function() {\n\t\treturn new Segment(this._point, this._handleOut, this._handleIn);\n\t},\n\n\tremove: function() {\n\t\treturn this._path ? !!this._path.removeSegment(this._index) : false;\n\t},\n\n\tclone: function() {\n\t\treturn new Segment(this._point, this._handleIn, this._handleOut);\n\t},\n\n\tequals: function(segment) {\n\t\treturn segment === this || segment && this._class === segment._class\n\t\t\t\t&& this._point.equals(segment._point)\n\t\t\t\t&& this._handleIn.equals(segment._handleIn)\n\t\t\t\t&& this._handleOut.equals(segment._handleOut)\n\t\t\t\t|| false;\n\t},\n\n\ttoString: function() {\n\t\tvar parts = [ 'point: ' + this._point ];\n\t\tif (!this._handleIn.isZero())\n\t\t\tparts.push('handleIn: ' + this._handleIn);\n\t\tif (!this._handleOut.isZero())\n\t\t\tparts.push('handleOut: ' + this._handleOut);\n\t\treturn '{ ' + parts.join(', ') + ' }';\n\t},\n\n\ttransform: function(matrix) {\n\t\tthis._transformCoordinates(matrix, new Array(6), true);\n\t\tthis._changed();\n\t},\n\n\tinterpolate: function(from, to, factor) {\n\t\tvar u = 1 - factor,\n\t\t\tv = factor,\n\t\t\tpoint1 = from._point,\n\t\t\tpoint2 = to._point,\n\t\t\thandleIn1 = from._handleIn,\n\t\t\thandleIn2 = to._handleIn,\n\t\t\thandleOut2 = to._handleOut,\n\t\t\thandleOut1 = from._handleOut;\n\t\tthis._point._set(\n\t\t\t\tu * point1._x + v * point2._x,\n\t\t\t\tu * point1._y + v * point2._y, true);\n\t\tthis._handleIn._set(\n\t\t\t\tu * handleIn1._x + v * handleIn2._x,\n\t\t\t\tu * handleIn1._y + v * handleIn2._y, true);\n\t\tthis._handleOut._set(\n\t\t\t\tu * handleOut1._x + v * handleOut2._x,\n\t\t\t\tu * handleOut1._y + v * handleOut2._y, true);\n\t\tthis._changed();\n\t},\n\n\t_transformCoordinates: function(matrix, coords, change) {\n\t\tvar point = this._point,\n\t\t\thandleIn = !change || !this._handleIn.isZero()\n\t\t\t\t\t? this._handleIn : null,\n\t\t\thandleOut = !change || !this._handleOut.isZero()\n\t\t\t\t\t? this._handleOut : null,\n\t\t\tx = point._x,\n\t\t\ty = point._y,\n\t\t\ti = 2;\n\t\tcoords[0] = x;\n\t\tcoords[1] = y;\n\t\tif (handleIn) {\n\t\t\tcoords[i++] = handleIn._x + x;\n\t\t\tcoords[i++] = handleIn._y + y;\n\t\t}\n\t\tif (handleOut) {\n\t\t\tcoords[i++] = handleOut._x + x;\n\t\t\tcoords[i++] = handleOut._y + y;\n\t\t}\n\t\tif (matrix) {\n\t\t\tmatrix._transformCoordinates(coords, coords, i / 2);\n\t\t\tx = coords[0];\n\t\t\ty = coords[1];\n\t\t\tif (change) {\n\t\t\t\tpoint._x = x;\n\t\t\t\tpoint._y = y;\n\t\t\t\ti = 2;\n\t\t\t\tif (handleIn) {\n\t\t\t\t\thandleIn._x = coords[i++] - x;\n\t\t\t\t\thandleIn._y = coords[i++] - y;\n\t\t\t\t}\n\t\t\t\tif (handleOut) {\n\t\t\t\t\thandleOut._x = coords[i++] - x;\n\t\t\t\t\thandleOut._y = coords[i++] - y;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (!handleIn) {\n\t\t\t\t\tcoords[i++] = x;\n\t\t\t\t\tcoords[i++] = y;\n\t\t\t\t}\n\t\t\t\tif (!handleOut) {\n\t\t\t\t\tcoords[i++] = x;\n\t\t\t\t\tcoords[i++] = y;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn coords;\n\t}\n});\n\nvar SegmentPoint = Point.extend({\n\tinitialize: function SegmentPoint(point, owner, key) {\n\t\tvar x, y,\n\t\t\tselected;\n\t\tif (!point) {\n\t\t\tx = y = 0;\n\t\t} else if ((x = point[0]) !== undefined) {\n\t\t\ty = point[1];\n\t\t} else {\n\t\t\tvar pt = point;\n\t\t\tif ((x = pt.x) === undefined) {\n\t\t\t\tpt = Point.read(arguments);\n\t\t\t\tx = pt.x;\n\t\t\t}\n\t\t\ty = pt.y;\n\t\t\tselected = pt.selected;\n\t\t}\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._owner = owner;\n\t\towner[key] = this;\n\t\tif (selected)\n\t\t\tthis.setSelected(true);\n\t},\n\n\t_set: function(x, y) {\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._owner._changed(this);\n\t\treturn this;\n\t},\n\n\tgetX: function() {\n\t\treturn this._x;\n\t},\n\n\tsetX: function(x) {\n\t\tthis._x = x;\n\t\tthis._owner._changed(this);\n\t},\n\n\tgetY: function() {\n\t\treturn this._y;\n\t},\n\n\tsetY: function(y) {\n\t\tthis._y = y;\n\t\tthis._owner._changed(this);\n\t},\n\n\tisZero: function() {\n\t\tvar isZero = Numerical.isZero;\n\t\treturn isZero(this._x) && isZero(this._y);\n\t},\n\n\tisSelected: function() {\n\t\treturn !!(this._owner._selection & this._getSelection());\n\t},\n\n\tsetSelected: function(selected) {\n\t\tthis._owner._changeSelection(this._getSelection(), selected);\n\t},\n\n\t_getSelection: function() {\n\t\tvar owner = this._owner;\n\t\treturn this === owner._point ? 1\n\t\t\t: this === owner._handleIn ? 2\n\t\t\t: this === owner._handleOut ? 4\n\t\t\t: 0;\n\t}\n});\n\nvar Curve = Base.extend({\n\t_class: 'Curve',\n\tbeans: true,\n\n\tinitialize: function Curve(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) {\n\t\tvar count = arguments.length,\n\t\t\tseg1, seg2,\n\t\t\tpoint1, point2,\n\t\t\thandle1, handle2;\n\t\tif (count === 3) {\n\t\t\tthis._path = arg0;\n\t\t\tseg1 = arg1;\n\t\t\tseg2 = arg2;\n\t\t} else if (!count) {\n\t\t\tseg1 = new Segment();\n\t\t\tseg2 = new Segment();\n\t\t} else if (count === 1) {\n\t\t\tif ('segment1' in arg0) {\n\t\t\t\tseg1 = new Segment(arg0.segment1);\n\t\t\t\tseg2 = new Segment(arg0.segment2);\n\t\t\t} else if ('point1' in arg0) {\n\t\t\t\tpoint1 = arg0.point1;\n\t\t\t\thandle1 = arg0.handle1;\n\t\t\t\thandle2 = arg0.handle2;\n\t\t\t\tpoint2 = arg0.point2;\n\t\t\t} else if (Array.isArray(arg0)) {\n\t\t\t\tpoint1 = [arg0[0], arg0[1]];\n\t\t\t\tpoint2 = [arg0[6], arg0[7]];\n\t\t\t\thandle1 = [arg0[2] - arg0[0], arg0[3] - arg0[1]];\n\t\t\t\thandle2 = [arg0[4] - arg0[6], arg0[5] - arg0[7]];\n\t\t\t}\n\t\t} else if (count === 2) {\n\t\t\tseg1 = new Segment(arg0);\n\t\t\tseg2 = new Segment(arg1);\n\t\t} else if (count === 4) {\n\t\t\tpoint1 = arg0;\n\t\t\thandle1 = arg1;\n\t\t\thandle2 = arg2;\n\t\t\tpoint2 = arg3;\n\t\t} else if (count === 8) {\n\t\t\tpoint1 = [arg0, arg1];\n\t\t\tpoint2 = [arg6, arg7];\n\t\t\thandle1 = [arg2 - arg0, arg3 - arg1];\n\t\t\thandle2 = [arg4 - arg6, arg5 - arg7];\n\t\t}\n\t\tthis._segment1 = seg1 || new Segment(point1, null, handle1);\n\t\tthis._segment2 = seg2 || new Segment(point2, handle2, null);\n\t},\n\n\t_serialize: function(options, dictionary) {\n\t\treturn Base.serialize(this.hasHandles()\n\t\t\t\t? [this.getPoint1(), this.getHandle1(), this.getHandle2(),\n\t\t\t\t\tthis.getPoint2()]\n\t\t\t\t: [this.getPoint1(), this.getPoint2()],\n\t\t\t\toptions, true, dictionary);\n\t},\n\n\t_changed: function() {\n\t\tthis._length = this._bounds = undefined;\n\t},\n\n\tclone: function() {\n\t\treturn new Curve(this._segment1, this._segment2);\n\t},\n\n\ttoString: function() {\n\t\tvar parts = [ 'point1: ' + this._segment1._point ];\n\t\tif (!this._segment1._handleOut.isZero())\n\t\t\tparts.push('handle1: ' + this._segment1._handleOut);\n\t\tif (!this._segment2._handleIn.isZero())\n\t\t\tparts.push('handle2: ' + this._segment2._handleIn);\n\t\tparts.push('point2: ' + this._segment2._point);\n\t\treturn '{ ' + parts.join(', ') + ' }';\n\t},\n\n\tclassify: function() {\n\t\treturn Curve.classify(this.getValues());\n\t},\n\n\tremove: function() {\n\t\tvar removed = false;\n\t\tif (this._path) {\n\t\t\tvar segment2 = this._segment2,\n\t\t\t\thandleOut = segment2._handleOut;\n\t\t\tremoved = segment2.remove();\n\t\t\tif (removed)\n\t\t\t\tthis._segment1._handleOut.set(handleOut);\n\t\t}\n\t\treturn removed;\n\t},\n\n\tgetPoint1: function() {\n\t\treturn this._segment1._point;\n\t},\n\n\tsetPoint1: function() {\n\t\tthis._segment1._point.set(Point.read(arguments));\n\t},\n\n\tgetPoint2: function() {\n\t\treturn this._segment2._point;\n\t},\n\n\tsetPoint2: function() {\n\t\tthis._segment2._point.set(Point.read(arguments));\n\t},\n\n\tgetHandle1: function() {\n\t\treturn this._segment1._handleOut;\n\t},\n\n\tsetHandle1: function() {\n\t\tthis._segment1._handleOut.set(Point.read(arguments));\n\t},\n\n\tgetHandle2: function() {\n\t\treturn this._segment2._handleIn;\n\t},\n\n\tsetHandle2: function() {\n\t\tthis._segment2._handleIn.set(Point.read(arguments));\n\t},\n\n\tgetSegment1: function() {\n\t\treturn this._segment1;\n\t},\n\n\tgetSegment2: function() {\n\t\treturn this._segment2;\n\t},\n\n\tgetPath: function() {\n\t\treturn this._path;\n\t},\n\n\tgetIndex: function() {\n\t\treturn this._segment1._index;\n\t},\n\n\tgetNext: function() {\n\t\tvar curves = this._path && this._path._curves;\n\t\treturn curves && (curves[this._segment1._index + 1]\n\t\t\t\t|| this._path._closed && curves[0]) || null;\n\t},\n\n\tgetPrevious: function() {\n\t\tvar curves = this._path && this._path._curves;\n\t\treturn curves && (curves[this._segment1._index - 1]\n\t\t\t\t|| this._path._closed && curves[curves.length - 1]) || null;\n\t},\n\n\tisFirst: function() {\n\t\treturn !this._segment1._index;\n\t},\n\n\tisLast: function() {\n\t\tvar path = this._path;\n\t\treturn path && this._segment1._index === path._curves.length - 1\n\t\t\t\t|| false;\n\t},\n\n\tisSelected: function() {\n\t\treturn this.getPoint1().isSelected()\n\t\t\t\t&& this.getHandle1().isSelected()\n\t\t\t\t&& this.getHandle2().isSelected()\n\t\t\t\t&& this.getPoint2().isSelected();\n\t},\n\n\tsetSelected: function(selected) {\n\t\tthis.getPoint1().setSelected(selected);\n\t\tthis.getHandle1().setSelected(selected);\n\t\tthis.getHandle2().setSelected(selected);\n\t\tthis.getPoint2().setSelected(selected);\n\t},\n\n\tgetValues: function(matrix) {\n\t\treturn Curve.getValues(this._segment1, this._segment2, matrix);\n\t},\n\n\tgetPoints: function() {\n\t\tvar coords = this.getValues(),\n\t\t\tpoints = [];\n\t\tfor (var i = 0; i < 8; i += 2)\n\t\t\tpoints.push(new Point(coords[i], coords[i + 1]));\n\t\treturn points;\n\t}\n}, {\n\tgetLength: function() {\n\t\tif (this._length == null)\n\t\t\tthis._length = Curve.getLength(this.getValues(), 0, 1);\n\t\treturn this._length;\n\t},\n\n\tgetArea: function() {\n\t\treturn Curve.getArea(this.getValues());\n\t},\n\n\tgetLine: function() {\n\t\treturn new Line(this._segment1._point, this._segment2._point);\n\t},\n\n\tgetPart: function(from, to) {\n\t\treturn new Curve(Curve.getPart(this.getValues(), from, to));\n\t},\n\n\tgetPartLength: function(from, to) {\n\t\treturn Curve.getLength(this.getValues(), from, to);\n\t},\n\n\tdivideAt: function(location) {\n\t\treturn this.divideAtTime(location && location.curve === this\n\t\t\t\t? location.time : this.getTimeAt(location));\n\t},\n\n\tdivideAtTime: function(time, _setHandles) {\n\t\tvar tMin = 1e-8,\n\t\t\ttMax = 1 - tMin,\n\t\t\tres = null;\n\t\tif (time >= tMin && time <= tMax) {\n\t\t\tvar parts = Curve.subdivide(this.getValues(), time),\n\t\t\t\tleft = parts[0],\n\t\t\t\tright = parts[1],\n\t\t\t\tsetHandles = _setHandles || this.hasHandles(),\n\t\t\t\tseg1 = this._segment1,\n\t\t\t\tseg2 = this._segment2,\n\t\t\t\tpath = this._path;\n\t\t\tif (setHandles) {\n\t\t\t\tseg1._handleOut._set(left[2] - left[0], left[3] - left[1]);\n\t\t\t\tseg2._handleIn._set(right[4] - right[6],right[5] - right[7]);\n\t\t\t}\n\t\t\tvar x = left[6], y = left[7],\n\t\t\t\tsegment = new Segment(new Point(x, y),\n\t\t\t\t\t\tsetHandles && new Point(left[4] - x, left[5] - y),\n\t\t\t\t\t\tsetHandles && new Point(right[2] - x, right[3] - y));\n\t\t\tif (path) {\n\t\t\t\tpath.insert(seg1._index + 1, segment);\n\t\t\t\tres = this.getNext();\n\t\t\t} else {\n\t\t\t\tthis._segment2 = segment;\n\t\t\t\tthis._changed();\n\t\t\t\tres = new Curve(segment, seg2);\n\t\t\t}\n\t\t}\n\t\treturn res;\n\t},\n\n\tsplitAt: function(location) {\n\t\tvar path = this._path;\n\t\treturn path ? path.splitAt(location) : null;\n\t},\n\n\tsplitAtTime: function(time) {\n\t\treturn this.splitAt(this.getLocationAtTime(time));\n\t},\n\n\tdivide: function(offset, isTime) {\n\t\treturn this.divideAtTime(offset === undefined ? 0.5 : isTime ? offset\n\t\t\t\t: this.getTimeAt(offset));\n\t},\n\n\tsplit: function(offset, isTime) {\n\t\treturn this.splitAtTime(offset === undefined ? 0.5 : isTime ? offset\n\t\t\t\t: this.getTimeAt(offset));\n\t},\n\n\treversed: function() {\n\t\treturn new Curve(this._segment2.reversed(), this._segment1.reversed());\n\t},\n\n\tclearHandles: function() {\n\t\tthis._segment1._handleOut._set(0, 0);\n\t\tthis._segment2._handleIn._set(0, 0);\n\t},\n\nstatics: {\n\tgetValues: function(segment1, segment2, matrix, straight) {\n\t\tvar p1 = segment1._point,\n\t\t\th1 = segment1._handleOut,\n\t\t\th2 = segment2._handleIn,\n\t\t\tp2 = segment2._point,\n\t\t\tx1 = p1.x, y1 = p1.y,\n\t\t\tx2 = p2.x, y2 = p2.y,\n\t\t\tvalues = straight\n\t\t\t\t? [ x1, y1, x1, y1, x2, y2, x2, y2 ]\n\t\t\t\t: [\n\t\t\t\t\tx1, y1,\n\t\t\t\t\tx1 + h1._x, y1 + h1._y,\n\t\t\t\t\tx2 + h2._x, y2 + h2._y,\n\t\t\t\t\tx2, y2\n\t\t\t\t];\n\t\tif (matrix)\n\t\t\tmatrix._transformCoordinates(values, values, 4);\n\t\treturn values;\n\t},\n\n\tsubdivide: function(v, t) {\n\t\tvar x0 = v[0], y0 = v[1],\n\t\t\tx1 = v[2], y1 = v[3],\n\t\t\tx2 = v[4], y2 = v[5],\n\t\t\tx3 = v[6], y3 = v[7];\n\t\tif (t === undefined)\n\t\t\tt = 0.5;\n\t\tvar u = 1 - t,\n\t\t\tx4 = u * x0 + t * x1, y4 = u * y0 + t * y1,\n\t\t\tx5 = u * x1 + t * x2, y5 = u * y1 + t * y2,\n\t\t\tx6 = u * x2 + t * x3, y6 = u * y2 + t * y3,\n\t\t\tx7 = u * x4 + t * x5, y7 = u * y4 + t * y5,\n\t\t\tx8 = u * x5 + t * x6, y8 = u * y5 + t * y6,\n\t\t\tx9 = u * x7 + t * x8, y9 = u * y7 + t * y8;\n\t\treturn [\n\t\t\t[x0, y0, x4, y4, x7, y7, x9, y9],\n\t\t\t[x9, y9, x8, y8, x6, y6, x3, y3]\n\t\t];\n\t},\n\n\tgetMonoCurves: function(v, dir) {\n\t\tvar curves = [],\n\t\t\tio = dir ? 0 : 1,\n\t\t\to0 = v[io + 0],\n\t\t\to1 = v[io + 2],\n\t\t\to2 = v[io + 4],\n\t\t\to3 = v[io + 6];\n\t\tif ((o0 >= o1) === (o1 >= o2) && (o1 >= o2) === (o2 >= o3)\n\t\t\t\t|| Curve.isStraight(v)) {\n\t\t\tcurves.push(v);\n\t\t} else {\n\t\t\tvar a = 3 * (o1 - o2) - o0 + o3,\n\t\t\t\tb = 2 * (o0 + o2) - 4 * o1,\n\t\t\t\tc = o1 - o0,\n\t\t\t\ttMin = 1e-8,\n\t\t\t\ttMax = 1 - tMin,\n\t\t\t\troots = [],\n\t\t\t\tn = Numerical.solveQuadratic(a, b, c, roots, tMin, tMax);\n\t\t\tif (!n) {\n\t\t\t\tcurves.push(v);\n\t\t\t} else {\n\t\t\t\troots.sort();\n\t\t\t\tvar t = roots[0],\n\t\t\t\t\tparts = Curve.subdivide(v, t);\n\t\t\t\tcurves.push(parts[0]);\n\t\t\t\tif (n > 1) {\n\t\t\t\t\tt = (roots[1] - t) / (1 - t);\n\t\t\t\t\tparts = Curve.subdivide(parts[1], t);\n\t\t\t\t\tcurves.push(parts[0]);\n\t\t\t\t}\n\t\t\t\tcurves.push(parts[1]);\n\t\t\t}\n\t\t}\n\t\treturn curves;\n\t},\n\n\tsolveCubic: function (v, coord, val, roots, min, max) {\n\t\tvar v0 = v[coord],\n\t\t\tv1 = v[coord + 2],\n\t\t\tv2 = v[coord + 4],\n\t\t\tv3 = v[coord + 6],\n\t\t\tres = 0;\n\t\tif ( !(v0 < val && v3 < val && v1 < val && v2 < val ||\n\t\t\t\tv0 > val && v3 > val && v1 > val && v2 > val)) {\n\t\t\tvar c = 3 * (v1 - v0),\n\t\t\t\tb = 3 * (v2 - v1) - c,\n\t\t\t\ta = v3 - v0 - c - b;\n\t\t\tres = Numerical.solveCubic(a, b, c, v0 - val, roots, min, max);\n\t\t}\n\t\treturn res;\n\t},\n\n\tgetTimeOf: function(v, point) {\n\t\tvar p0 = new Point(v[0], v[1]),\n\t\t\tp3 = new Point(v[6], v[7]),\n\t\t\tepsilon = 1e-12,\n\t\t\tgeomEpsilon = 1e-7,\n\t\t\tt = point.isClose(p0, epsilon) ? 0\n\t\t\t : point.isClose(p3, epsilon) ? 1\n\t\t\t : null;\n\t\tif (t === null) {\n\t\t\tvar coords = [point.x, point.y],\n\t\t\t\troots = [];\n\t\t\tfor (var c = 0; c < 2; c++) {\n\t\t\t\tvar count = Curve.solveCubic(v, c, coords[c], roots, 0, 1);\n\t\t\t\tfor (var i = 0; i < count; i++) {\n\t\t\t\t\tvar u = roots[i];\n\t\t\t\t\tif (point.isClose(Curve.getPoint(v, u), geomEpsilon))\n\t\t\t\t\t\treturn u;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn point.isClose(p0, geomEpsilon) ? 0\n\t\t\t : point.isClose(p3, geomEpsilon) ? 1\n\t\t\t : null;\n\t},\n\n\tgetNearestTime: function(v, point) {\n\t\tif (Curve.isStraight(v)) {\n\t\t\tvar x0 = v[0], y0 = v[1],\n\t\t\t\tx3 = v[6], y3 = v[7],\n\t\t\t\tvx = x3 - x0, vy = y3 - y0,\n\t\t\t\tdet = vx * vx + vy * vy;\n\t\t\tif (det === 0)\n\t\t\t\treturn 0;\n\t\t\tvar u = ((point.x - x0) * vx + (point.y - y0) * vy) / det;\n\t\t\treturn u < 1e-12 ? 0\n\t\t\t\t : u > 0.999999999999 ? 1\n\t\t\t\t : Curve.getTimeOf(v,\n\t\t\t\t\tnew Point(x0 + u * vx, y0 + u * vy));\n\t\t}\n\n\t\tvar count = 100,\n\t\t\tminDist = Infinity,\n\t\t\tminT = 0;\n\n\t\tfunction refine(t) {\n\t\t\tif (t >= 0 && t <= 1) {\n\t\t\t\tvar dist = point.getDistance(Curve.getPoint(v, t), true);\n\t\t\t\tif (dist < minDist) {\n\t\t\t\t\tminDist = dist;\n\t\t\t\t\tminT = t;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (var i = 0; i <= count; i++)\n\t\t\trefine(i / count);\n\n\t\tvar step = 1 / (count * 2);\n\t\twhile (step > 1e-8) {\n\t\t\tif (!refine(minT - step) && !refine(minT + step))\n\t\t\t\tstep /= 2;\n\t\t}\n\t\treturn minT;\n\t},\n\n\tgetPart: function(v, from, to) {\n\t\tvar flip = from > to;\n\t\tif (flip) {\n\t\t\tvar tmp = from;\n\t\t\tfrom = to;\n\t\t\tto = tmp;\n\t\t}\n\t\tif (from > 0)\n\t\t\tv = Curve.subdivide(v, from)[1];\n\t\tif (to < 1)\n\t\t\tv = Curve.subdivide(v, (to - from) / (1 - from))[0];\n\t\treturn flip\n\t\t\t\t? [v[6], v[7], v[4], v[5], v[2], v[3], v[0], v[1]]\n\t\t\t\t: v;\n\t},\n\n\tisFlatEnough: function(v, flatness) {\n\t\tvar x0 = v[0], y0 = v[1],\n\t\t\tx1 = v[2], y1 = v[3],\n\t\t\tx2 = v[4], y2 = v[5],\n\t\t\tx3 = v[6], y3 = v[7],\n\t\t\tux = 3 * x1 - 2 * x0 - x3,\n\t\t\tuy = 3 * y1 - 2 * y0 - y3,\n\t\t\tvx = 3 * x2 - 2 * x3 - x0,\n\t\t\tvy = 3 * y2 - 2 * y3 - y0;\n\t\treturn Math.max(ux * ux, vx * vx) + Math.max(uy * uy, vy * vy)\n\t\t\t\t<= 16 * flatness * flatness;\n\t},\n\n\tgetArea: function(v) {\n\t\tvar x0 = v[0], y0 = v[1],\n\t\t\tx1 = v[2], y1 = v[3],\n\t\t\tx2 = v[4], y2 = v[5],\n\t\t\tx3 = v[6], y3 = v[7];\n\t\treturn 3 * ((y3 - y0) * (x1 + x2) - (x3 - x0) * (y1 + y2)\n\t\t\t\t+ y1 * (x0 - x2) - x1 * (y0 - y2)\n\t\t\t\t+ y3 * (x2 + x0 / 3) - x3 * (y2 + y0 / 3)) / 20;\n\t},\n\n\tgetBounds: function(v) {\n\t\tvar min = v.slice(0, 2),\n\t\t\tmax = min.slice(),\n\t\t\troots = [0, 0];\n\t\tfor (var i = 0; i < 2; i++)\n\t\t\tCurve._addBounds(v[i], v[i + 2], v[i + 4], v[i + 6],\n\t\t\t\t\ti, 0, min, max, roots);\n\t\treturn new Rectangle(min[0], min[1], max[0] - min[0], max[1] - min[1]);\n\t},\n\n\t_addBounds: function(v0, v1, v2, v3, coord, padding, min, max, roots) {\n\t\tfunction add(value, padding) {\n\t\t\tvar left = value - padding,\n\t\t\t\tright = value + padding;\n\t\t\tif (left < min[coord])\n\t\t\t\tmin[coord] = left;\n\t\t\tif (right > max[coord])\n\t\t\t\tmax[coord] = right;\n\t\t}\n\n\t\tpadding /= 2;\n\t\tvar minPad = min[coord] + padding,\n\t\t\tmaxPad = max[coord] - padding;\n\t\tif ( v0 < minPad || v1 < minPad || v2 < minPad || v3 < minPad ||\n\t\t\t\tv0 > maxPad || v1 > maxPad || v2 > maxPad || v3 > maxPad) {\n\t\t\tif (v1 < v0 != v1 < v3 && v2 < v0 != v2 < v3) {\n\t\t\t\tadd(v0, 0);\n\t\t\t\tadd(v3, 0);\n\t\t\t} else {\n\t\t\t\tvar a = 3 * (v1 - v2) - v0 + v3,\n\t\t\t\t\tb = 2 * (v0 + v2) - 4 * v1,\n\t\t\t\t\tc = v1 - v0,\n\t\t\t\t\tcount = Numerical.solveQuadratic(a, b, c, roots),\n\t\t\t\t\ttMin = 1e-8,\n\t\t\t\t\ttMax = 1 - tMin;\n\t\t\t\tadd(v3, 0);\n\t\t\t\tfor (var i = 0; i < count; i++) {\n\t\t\t\t\tvar t = roots[i],\n\t\t\t\t\t\tu = 1 - t;\n\t\t\t\t\tif (tMin <= t && t <= tMax)\n\t\t\t\t\t\tadd(u * u * u * v0\n\t\t\t\t\t\t\t+ 3 * u * u * t * v1\n\t\t\t\t\t\t\t+ 3 * u * t * t * v2\n\t\t\t\t\t\t\t+ t * t * t * v3,\n\t\t\t\t\t\t\tpadding);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}}, Base.each(\n\t['getBounds', 'getStrokeBounds', 'getHandleBounds'],\n\tfunction(name) {\n\t\tthis[name] = function() {\n\t\t\tif (!this._bounds)\n\t\t\t\tthis._bounds = {};\n\t\t\tvar bounds = this._bounds[name];\n\t\t\tif (!bounds) {\n\t\t\t\tbounds = this._bounds[name] = Path[name](\n\t\t\t\t\t\t[this._segment1, this._segment2], false, this._path);\n\t\t\t}\n\t\t\treturn bounds.clone();\n\t\t};\n\t},\n{\n\n}), Base.each({\n\tisStraight: function(p1, h1, h2, p2) {\n\t\tif (h1.isZero() && h2.isZero()) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\tvar v = p2.subtract(p1);\n\t\t\tif (v.isZero()) {\n\t\t\t\treturn false;\n\t\t\t} else if (v.isCollinear(h1) && v.isCollinear(h2)) {\n\t\t\t\tvar l = new Line(p1, p2),\n\t\t\t\t\tepsilon = 1e-7;\n\t\t\t\tif (l.getDistance(p1.add(h1)) < epsilon &&\n\t\t\t\t\tl.getDistance(p2.add(h2)) < epsilon) {\n\t\t\t\t\tvar div = v.dot(v),\n\t\t\t\t\t\ts1 = v.dot(h1) / div,\n\t\t\t\t\t\ts2 = v.dot(h2) / div;\n\t\t\t\t\treturn s1 >= 0 && s1 <= 1 && s2 <= 0 && s2 >= -1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\tisLinear: function(p1, h1, h2, p2) {\n\t\tvar third = p2.subtract(p1).divide(3);\n\t\treturn h1.equals(third) && h2.negate().equals(third);\n\t}\n}, function(test, name) {\n\tthis[name] = function(epsilon) {\n\t\tvar seg1 = this._segment1,\n\t\t\tseg2 = this._segment2;\n\t\treturn test(seg1._point, seg1._handleOut, seg2._handleIn, seg2._point,\n\t\t\t\tepsilon);\n\t};\n\n\tthis.statics[name] = function(v, epsilon) {\n\t\tvar x0 = v[0], y0 = v[1],\n\t\t\tx3 = v[6], y3 = v[7];\n\t\treturn test(\n\t\t\t\tnew Point(x0, y0),\n\t\t\t\tnew Point(v[2] - x0, v[3] - y0),\n\t\t\t\tnew Point(v[4] - x3, v[5] - y3),\n\t\t\t\tnew Point(x3, y3), epsilon);\n\t};\n}, {\n\tstatics: {},\n\n\thasHandles: function() {\n\t\treturn !this._segment1._handleOut.isZero()\n\t\t\t\t|| !this._segment2._handleIn.isZero();\n\t},\n\n\thasLength: function(epsilon) {\n\t\treturn (!this.getPoint1().equals(this.getPoint2()) || this.hasHandles())\n\t\t\t\t&& this.getLength() > (epsilon || 0);\n\t},\n\n\tisCollinear: function(curve) {\n\t\treturn curve && this.isStraight() && curve.isStraight()\n\t\t\t\t&& this.getLine().isCollinear(curve.getLine());\n\t},\n\n\tisHorizontal: function() {\n\t\treturn this.isStraight() && Math.abs(this.getTangentAtTime(0.5).y)\n\t\t\t\t< 1e-8;\n\t},\n\n\tisVertical: function() {\n\t\treturn this.isStraight() && Math.abs(this.getTangentAtTime(0.5).x)\n\t\t\t\t< 1e-8;\n\t}\n}), {\n\tbeans: false,\n\n\tgetLocationAt: function(offset, _isTime) {\n\t\treturn this.getLocationAtTime(\n\t\t\t\t_isTime ? offset : this.getTimeAt(offset));\n\t},\n\n\tgetLocationAtTime: function(t) {\n\t\treturn t != null && t >= 0 && t <= 1\n\t\t\t\t? new CurveLocation(this, t)\n\t\t\t\t: null;\n\t},\n\n\tgetTimeAt: function(offset, start) {\n\t\treturn Curve.getTimeAt(this.getValues(), offset, start);\n\t},\n\n\tgetParameterAt: '#getTimeAt',\n\n\tgetTimesWithTangent: function () {\n\t\tvar tangent = Point.read(arguments);\n\t\treturn tangent.isZero()\n\t\t\t\t? []\n\t\t\t\t: Curve.getTimesWithTangent(this.getValues(), tangent);\n\t},\n\n\tgetOffsetAtTime: function(t) {\n\t\treturn this.getPartLength(0, t);\n\t},\n\n\tgetLocationOf: function() {\n\t\treturn this.getLocationAtTime(this.getTimeOf(Point.read(arguments)));\n\t},\n\n\tgetOffsetOf: function() {\n\t\tvar loc = this.getLocationOf.apply(this, arguments);\n\t\treturn loc ? loc.getOffset() : null;\n\t},\n\n\tgetTimeOf: function() {\n\t\treturn Curve.getTimeOf(this.getValues(), Point.read(arguments));\n\t},\n\n\tgetParameterOf: '#getTimeOf',\n\n\tgetNearestLocation: function() {\n\t\tvar point = Point.read(arguments),\n\t\t\tvalues = this.getValues(),\n\t\t\tt = Curve.getNearestTime(values, point),\n\t\t\tpt = Curve.getPoint(values, t);\n\t\treturn new CurveLocation(this, t, pt, null, point.getDistance(pt));\n\t},\n\n\tgetNearestPoint: function() {\n\t\tvar loc = this.getNearestLocation.apply(this, arguments);\n\t\treturn loc ? loc.getPoint() : loc;\n\t}\n\n},\nnew function() {\n\tvar methods = ['getPoint', 'getTangent', 'getNormal', 'getWeightedTangent',\n\t\t'getWeightedNormal', 'getCurvature'];\n\treturn Base.each(methods,\n\t\tfunction(name) {\n\t\t\tthis[name + 'At'] = function(location, _isTime) {\n\t\t\t\tvar values = this.getValues();\n\t\t\t\treturn Curve[name](values, _isTime ? location\n\t\t\t\t\t\t: Curve.getTimeAt(values, location));\n\t\t\t};\n\n\t\t\tthis[name + 'AtTime'] = function(time) {\n\t\t\t\treturn Curve[name](this.getValues(), time);\n\t\t\t};\n\t\t}, {\n\t\t\tstatics: {\n\t\t\t\t_evaluateMethods: methods\n\t\t\t}\n\t\t}\n\t);\n},\nnew function() {\n\n\tfunction getLengthIntegrand(v) {\n\t\tvar x0 = v[0], y0 = v[1],\n\t\t\tx1 = v[2], y1 = v[3],\n\t\t\tx2 = v[4], y2 = v[5],\n\t\t\tx3 = v[6], y3 = v[7],\n\n\t\t\tax = 9 * (x1 - x2) + 3 * (x3 - x0),\n\t\t\tbx = 6 * (x0 + x2) - 12 * x1,\n\t\t\tcx = 3 * (x1 - x0),\n\n\t\t\tay = 9 * (y1 - y2) + 3 * (y3 - y0),\n\t\t\tby = 6 * (y0 + y2) - 12 * y1,\n\t\t\tcy = 3 * (y1 - y0);\n\n\t\treturn function(t) {\n\t\t\tvar dx = (ax * t + bx) * t + cx,\n\t\t\t\tdy = (ay * t + by) * t + cy;\n\t\t\treturn Math.sqrt(dx * dx + dy * dy);\n\t\t};\n\t}\n\n\tfunction getIterations(a, b) {\n\t\treturn Math.max(2, Math.min(16, Math.ceil(Math.abs(b - a) * 32)));\n\t}\n\n\tfunction evaluate(v, t, type, normalized) {\n\t\tif (t == null || t < 0 || t > 1)\n\t\t\treturn null;\n\t\tvar x0 = v[0], y0 = v[1],\n\t\t\tx1 = v[2], y1 = v[3],\n\t\t\tx2 = v[4], y2 = v[5],\n\t\t\tx3 = v[6], y3 = v[7],\n\t\t\tisZero = Numerical.isZero;\n\t\tif (isZero(x1 - x0) && isZero(y1 - y0)) {\n\t\t\tx1 = x0;\n\t\t\ty1 = y0;\n\t\t}\n\t\tif (isZero(x2 - x3) && isZero(y2 - y3)) {\n\t\t\tx2 = x3;\n\t\t\ty2 = y3;\n\t\t}\n\t\tvar cx = 3 * (x1 - x0),\n\t\t\tbx = 3 * (x2 - x1) - cx,\n\t\t\tax = x3 - x0 - cx - bx,\n\t\t\tcy = 3 * (y1 - y0),\n\t\t\tby = 3 * (y2 - y1) - cy,\n\t\t\tay = y3 - y0 - cy - by,\n\t\t\tx, y;\n\t\tif (type === 0) {\n\t\t\tx = t === 0 ? x0 : t === 1 ? x3\n\t\t\t\t\t: ((ax * t + bx) * t + cx) * t + x0;\n\t\t\ty = t === 0 ? y0 : t === 1 ? y3\n\t\t\t\t\t: ((ay * t + by) * t + cy) * t + y0;\n\t\t} else {\n\t\t\tvar tMin = 1e-8,\n\t\t\t\ttMax = 1 - tMin;\n\t\t\tif (t < tMin) {\n\t\t\t\tx = cx;\n\t\t\t\ty = cy;\n\t\t\t} else if (t > tMax) {\n\t\t\t\tx = 3 * (x3 - x2);\n\t\t\t\ty = 3 * (y3 - y2);\n\t\t\t} else {\n\t\t\t\tx = (3 * ax * t + 2 * bx) * t + cx;\n\t\t\t\ty = (3 * ay * t + 2 * by) * t + cy;\n\t\t\t}\n\t\t\tif (normalized) {\n\t\t\t\tif (x === 0 && y === 0 && (t < tMin || t > tMax)) {\n\t\t\t\t\tx = x2 - x1;\n\t\t\t\t\ty = y2 - y1;\n\t\t\t\t}\n\t\t\t\tvar len = Math.sqrt(x * x + y * y);\n\t\t\t\tif (len) {\n\t\t\t\t\tx /= len;\n\t\t\t\t\ty /= len;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (type === 3) {\n\t\t\t\tvar x2 = 6 * ax * t + 2 * bx,\n\t\t\t\t\ty2 = 6 * ay * t + 2 * by,\n\t\t\t\t\td = Math.pow(x * x + y * y, 3 / 2);\n\t\t\t\tx = d !== 0 ? (x * y2 - y * x2) / d : 0;\n\t\t\t\ty = 0;\n\t\t\t}\n\t\t}\n\t\treturn type === 2 ? new Point(y, -x) : new Point(x, y);\n\t}\n\n\treturn { statics: {\n\n\t\tclassify: function(v) {\n\n\t\t\tvar x0 = v[0], y0 = v[1],\n\t\t\t\tx1 = v[2], y1 = v[3],\n\t\t\t\tx2 = v[4], y2 = v[5],\n\t\t\t\tx3 = v[6], y3 = v[7],\n\t\t\t\ta1 = x0 * (y3 - y2) + y0 * (x2 - x3) + x3 * y2 - y3 * x2,\n\t\t\t\ta2 = x1 * (y0 - y3) + y1 * (x3 - x0) + x0 * y3 - y0 * x3,\n\t\t\t\ta3 = x2 * (y1 - y0) + y2 * (x0 - x1) + x1 * y0 - y1 * x0,\n\t\t\t\td3 = 3 * a3,\n\t\t\t\td2 = d3 - a2,\n\t\t\t\td1 = d2 - a2 + a1,\n\t\t\t\tl = Math.sqrt(d1 * d1 + d2 * d2 + d3 * d3),\n\t\t\t\ts = l !== 0 ? 1 / l : 0,\n\t\t\t\tisZero = Numerical.isZero,\n\t\t\t\tserpentine = 'serpentine';\n\t\t\td1 *= s;\n\t\t\td2 *= s;\n\t\t\td3 *= s;\n\n\t\t\tfunction type(type, t1, t2) {\n\t\t\t\tvar hasRoots = t1 !== undefined,\n\t\t\t\t\tt1Ok = hasRoots && t1 > 0 && t1 < 1,\n\t\t\t\t\tt2Ok = hasRoots && t2 > 0 && t2 < 1;\n\t\t\t\tif (hasRoots && (!(t1Ok || t2Ok)\n\t\t\t\t\t\t|| type === 'loop' && !(t1Ok && t2Ok))) {\n\t\t\t\t\ttype = 'arch';\n\t\t\t\t\tt1Ok = t2Ok = false;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\ttype: type,\n\t\t\t\t\troots: t1Ok || t2Ok\n\t\t\t\t\t\t\t? t1Ok && t2Ok\n\t\t\t\t\t\t\t\t? t1 < t2 ? [t1, t2] : [t2, t1]\n\t\t\t\t\t\t\t\t: [t1Ok ? t1 : t2]\n\t\t\t\t\t\t\t: null\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (isZero(d1)) {\n\t\t\t\treturn isZero(d2)\n\t\t\t\t\t\t? type(isZero(d3) ? 'line' : 'quadratic')\n\t\t\t\t\t\t: type(serpentine, d3 / (3 * d2));\n\t\t\t}\n\t\t\tvar d = 3 * d2 * d2 - 4 * d1 * d3;\n\t\t\tif (isZero(d)) {\n\t\t\t\treturn type('cusp', d2 / (2 * d1));\n\t\t\t}\n\t\t\tvar f1 = d > 0 ? Math.sqrt(d / 3) : Math.sqrt(-d),\n\t\t\t\tf2 = 2 * d1;\n\t\t\treturn type(d > 0 ? serpentine : 'loop',\n\t\t\t\t\t(d2 + f1) / f2,\n\t\t\t\t\t(d2 - f1) / f2);\n\t\t},\n\n\t\tgetLength: function(v, a, b, ds) {\n\t\t\tif (a === undefined)\n\t\t\t\ta = 0;\n\t\t\tif (b === undefined)\n\t\t\t\tb = 1;\n\t\t\tif (Curve.isStraight(v)) {\n\t\t\t\tvar c = v;\n\t\t\t\tif (b < 1) {\n\t\t\t\t\tc = Curve.subdivide(c, b)[0];\n\t\t\t\t\ta /= b;\n\t\t\t\t}\n\t\t\t\tif (a > 0) {\n\t\t\t\t\tc = Curve.subdivide(c, a)[1];\n\t\t\t\t}\n\t\t\t\tvar dx = c[6] - c[0],\n\t\t\t\t\tdy = c[7] - c[1];\n\t\t\t\treturn Math.sqrt(dx * dx + dy * dy);\n\t\t\t}\n\t\t\treturn Numerical.integrate(ds || getLengthIntegrand(v), a, b,\n\t\t\t\t\tgetIterations(a, b));\n\t\t},\n\n\t\tgetTimeAt: function(v, offset, start) {\n\t\t\tif (start === undefined)\n\t\t\t\tstart = offset < 0 ? 1 : 0;\n\t\t\tif (offset === 0)\n\t\t\t\treturn start;\n\t\t\tvar abs = Math.abs,\n\t\t\t\tepsilon = 1e-12,\n\t\t\t\tforward = offset > 0,\n\t\t\t\ta = forward ? start : 0,\n\t\t\t\tb = forward ? 1 : start,\n\t\t\t\tds = getLengthIntegrand(v),\n\t\t\t\trangeLength = Curve.getLength(v, a, b, ds),\n\t\t\t\tdiff = abs(offset) - rangeLength;\n\t\t\tif (abs(diff) < epsilon) {\n\t\t\t\treturn forward ? b : a;\n\t\t\t} else if (diff > epsilon) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tvar guess = offset / rangeLength,\n\t\t\t\tlength = 0;\n\t\t\tfunction f(t) {\n\t\t\t\tlength += Numerical.integrate(ds, start, t,\n\t\t\t\t\t\tgetIterations(start, t));\n\t\t\t\tstart = t;\n\t\t\t\treturn length - offset;\n\t\t\t}\n\t\t\treturn Numerical.findRoot(f, ds, start + guess, a, b, 32,\n\t\t\t\t\t1e-12);\n\t\t},\n\n\t\tgetPoint: function(v, t) {\n\t\t\treturn evaluate(v, t, 0, false);\n\t\t},\n\n\t\tgetTangent: function(v, t) {\n\t\t\treturn evaluate(v, t, 1, true);\n\t\t},\n\n\t\tgetWeightedTangent: function(v, t) {\n\t\t\treturn evaluate(v, t, 1, false);\n\t\t},\n\n\t\tgetNormal: function(v, t) {\n\t\t\treturn evaluate(v, t, 2, true);\n\t\t},\n\n\t\tgetWeightedNormal: function(v, t) {\n\t\t\treturn evaluate(v, t, 2, false);\n\t\t},\n\n\t\tgetCurvature: function(v, t) {\n\t\t\treturn evaluate(v, t, 3, false).x;\n\t\t},\n\n\t\tgetPeaks: function(v) {\n\t\t\tvar x0 = v[0], y0 = v[1],\n\t\t\t\tx1 = v[2], y1 = v[3],\n\t\t\t\tx2 = v[4], y2 = v[5],\n\t\t\t\tx3 = v[6], y3 = v[7],\n\t\t\t\tax = -x0 + 3 * x1 - 3 * x2 + x3,\n\t\t\t\tbx = 3 * x0 - 6 * x1 + 3 * x2,\n\t\t\t\tcx = -3 * x0 + 3 * x1,\n\t\t\t\tay = -y0 + 3 * y1 - 3 * y2 + y3,\n\t\t\t\tby = 3 * y0 - 6 * y1 + 3 * y2,\n\t\t\t\tcy = -3 * y0 + 3 * y1,\n\t\t\t\ttMin = 1e-8,\n\t\t\t\ttMax = 1 - tMin,\n\t\t\t\troots = [];\n\t\t\tNumerical.solveCubic(\n\t\t\t\t\t9 * (ax * ax + ay * ay),\n\t\t\t\t\t9 * (ax * bx + by * ay),\n\t\t\t\t\t2 * (bx * bx + by * by) + 3 * (cx * ax + cy * ay),\n\t\t\t\t\t(cx * bx + by * cy),\n\t\t\t\t\troots, tMin, tMax);\n\t\t\treturn roots.sort();\n\t\t}\n\t}};\n},\nnew function() {\n\n\tfunction addLocation(locations, include, c1, t1, c2, t2, overlap) {\n\t\tvar excludeStart = !overlap && c1.getPrevious() === c2,\n\t\t\texcludeEnd = !overlap && c1 !== c2 && c1.getNext() === c2,\n\t\t\ttMin = 1e-8,\n\t\t\ttMax = 1 - tMin;\n\t\tif (t1 !== null && t1 >= (excludeStart ? tMin : 0) &&\n\t\t\tt1 <= (excludeEnd ? tMax : 1)) {\n\t\t\tif (t2 !== null && t2 >= (excludeEnd ? tMin : 0) &&\n\t\t\t\tt2 <= (excludeStart ? tMax : 1)) {\n\t\t\t\tvar loc1 = new CurveLocation(c1, t1, null, overlap),\n\t\t\t\t\tloc2 = new CurveLocation(c2, t2, null, overlap);\n\t\t\t\tloc1._intersection = loc2;\n\t\t\t\tloc2._intersection = loc1;\n\t\t\t\tif (!include || include(loc1)) {\n\t\t\t\t\tCurveLocation.insert(locations, loc1, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction addCurveIntersections(v1, v2, c1, c2, locations, include, flip,\n\t\t\trecursion, calls, tMin, tMax, uMin, uMax) {\n\t\tif (++calls >= 4096 || ++recursion >= 40)\n\t\t\treturn calls;\n\t\tvar fatLineEpsilon = 1e-9,\n\t\t\tq0x = v2[0], q0y = v2[1], q3x = v2[6], q3y = v2[7],\n\t\t\tgetSignedDistance = Line.getSignedDistance,\n\t\t\td1 = getSignedDistance(q0x, q0y, q3x, q3y, v2[2], v2[3]),\n\t\t\td2 = getSignedDistance(q0x, q0y, q3x, q3y, v2[4], v2[5]),\n\t\t\tfactor = d1 * d2 > 0 ? 3 / 4 : 4 / 9,\n\t\t\tdMin = factor * Math.min(0, d1, d2),\n\t\t\tdMax = factor * Math.max(0, d1, d2),\n\t\t\tdp0 = getSignedDistance(q0x, q0y, q3x, q3y, v1[0], v1[1]),\n\t\t\tdp1 = getSignedDistance(q0x, q0y, q3x, q3y, v1[2], v1[3]),\n\t\t\tdp2 = getSignedDistance(q0x, q0y, q3x, q3y, v1[4], v1[5]),\n\t\t\tdp3 = getSignedDistance(q0x, q0y, q3x, q3y, v1[6], v1[7]),\n\t\t\thull = getConvexHull(dp0, dp1, dp2, dp3),\n\t\t\ttop = hull[0],\n\t\t\tbottom = hull[1],\n\t\t\ttMinClip,\n\t\t\ttMaxClip;\n\t\tif (d1 === 0 && d2 === 0\n\t\t\t\t&& dp0 === 0 && dp1 === 0 && dp2 === 0 && dp3 === 0\n\t\t\t|| (tMinClip = clipConvexHull(top, bottom, dMin, dMax)) == null\n\t\t\t|| (tMaxClip = clipConvexHull(top.reverse(), bottom.reverse(),\n\t\t\t\tdMin, dMax)) == null)\n\t\t\treturn calls;\n\t\tvar tMinNew = tMin + (tMax - tMin) * tMinClip,\n\t\t\ttMaxNew = tMin + (tMax - tMin) * tMaxClip;\n\t\tif (Math.max(uMax - uMin, tMaxNew - tMinNew) < fatLineEpsilon) {\n\t\t\tvar t = (tMinNew + tMaxNew) / 2,\n\t\t\t\tu = (uMin + uMax) / 2;\n\t\t\taddLocation(locations, include,\n\t\t\t\t\tflip ? c2 : c1, flip ? u : t,\n\t\t\t\t\tflip ? c1 : c2, flip ? t : u);\n\t\t} else {\n\t\t\tv1 = Curve.getPart(v1, tMinClip, tMaxClip);\n\t\t\tvar uDiff = uMax - uMin;\n\t\t\tif (tMaxClip - tMinClip > 0.8) {\n\t\t\t\tif (tMaxNew - tMinNew > uDiff) {\n\t\t\t\t\tvar parts = Curve.subdivide(v1, 0.5),\n\t\t\t\t\t\tt = (tMinNew + tMaxNew) / 2;\n\t\t\t\t\tcalls = addCurveIntersections(\n\t\t\t\t\t\t\tv2, parts[0], c2, c1, locations, include, !flip,\n\t\t\t\t\t\t\trecursion, calls, uMin, uMax, tMinNew, t);\n\t\t\t\t\tcalls = addCurveIntersections(\n\t\t\t\t\t\t\tv2, parts[1], c2, c1, locations, include, !flip,\n\t\t\t\t\t\t\trecursion, calls, uMin, uMax, t, tMaxNew);\n\t\t\t\t} else {\n\t\t\t\t\tvar parts = Curve.subdivide(v2, 0.5),\n\t\t\t\t\t\tu = (uMin + uMax) / 2;\n\t\t\t\t\tcalls = addCurveIntersections(\n\t\t\t\t\t\t\tparts[0], v1, c2, c1, locations, include, !flip,\n\t\t\t\t\t\t\trecursion, calls, uMin, u, tMinNew, tMaxNew);\n\t\t\t\t\tcalls = addCurveIntersections(\n\t\t\t\t\t\t\tparts[1], v1, c2, c1, locations, include, !flip,\n\t\t\t\t\t\t\trecursion, calls, u, uMax, tMinNew, tMaxNew);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (uDiff === 0 || uDiff >= fatLineEpsilon) {\n\t\t\t\t\tcalls = addCurveIntersections(\n\t\t\t\t\t\t\tv2, v1, c2, c1, locations, include, !flip,\n\t\t\t\t\t\t\trecursion, calls, uMin, uMax, tMinNew, tMaxNew);\n\t\t\t\t} else {\n\t\t\t\t\tcalls = addCurveIntersections(\n\t\t\t\t\t\t\tv1, v2, c1, c2, locations, include, flip,\n\t\t\t\t\t\t\trecursion, calls, tMinNew, tMaxNew, uMin, uMax);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn calls;\n\t}\n\n\tfunction getConvexHull(dq0, dq1, dq2, dq3) {\n\t\tvar p0 = [ 0, dq0 ],\n\t\t\tp1 = [ 1 / 3, dq1 ],\n\t\t\tp2 = [ 2 / 3, dq2 ],\n\t\t\tp3 = [ 1, dq3 ],\n\t\t\tdist1 = dq1 - (2 * dq0 + dq3) / 3,\n\t\t\tdist2 = dq2 - (dq0 + 2 * dq3) / 3,\n\t\t\thull;\n\t\tif (dist1 * dist2 < 0) {\n\t\t\thull = [[p0, p1, p3], [p0, p2, p3]];\n\t\t} else {\n\t\t\tvar distRatio = dist1 / dist2;\n\t\t\thull = [\n\t\t\t\tdistRatio >= 2 ? [p0, p1, p3]\n\t\t\t\t: distRatio <= 0.5 ? [p0, p2, p3]\n\t\t\t\t: [p0, p1, p2, p3],\n\t\t\t\t[p0, p3]\n\t\t\t];\n\t\t}\n\t\treturn (dist1 || dist2) < 0 ? hull.reverse() : hull;\n\t}\n\n\tfunction clipConvexHull(hullTop, hullBottom, dMin, dMax) {\n\t\tif (hullTop[0][1] < dMin) {\n\t\t\treturn clipConvexHullPart(hullTop, true, dMin);\n\t\t} else if (hullBottom[0][1] > dMax) {\n\t\t\treturn clipConvexHullPart(hullBottom, false, dMax);\n\t\t} else {\n\t\t\treturn hullTop[0][0];\n\t\t}\n\t}\n\n\tfunction clipConvexHullPart(part, top, threshold) {\n\t\tvar px = part[0][0],\n\t\t\tpy = part[0][1];\n\t\tfor (var i = 1, l = part.length; i < l; i++) {\n\t\t\tvar qx = part[i][0],\n\t\t\t\tqy = part[i][1];\n\t\t\tif (top ? qy >= threshold : qy <= threshold) {\n\t\t\t\treturn qy === threshold ? qx\n\t\t\t\t\t\t: px + (threshold - py) * (qx - px) / (qy - py);\n\t\t\t}\n\t\t\tpx = qx;\n\t\t\tpy = qy;\n\t\t}\n\t\treturn null;\n\t}\n\n\tfunction getCurveLineIntersections(v, px, py, vx, vy) {\n\t\tvar isZero = Numerical.isZero;\n\t\tif (isZero(vx) && isZero(vy)) {\n\t\t\tvar t = Curve.getTimeOf(v, new Point(px, py));\n\t\t\treturn t === null ? [] : [t];\n\t\t}\n\t\tvar angle = Math.atan2(-vy, vx),\n\t\t\tsin = Math.sin(angle),\n\t\t\tcos = Math.cos(angle),\n\t\t\trv = [],\n\t\t\troots = [];\n\t\tfor (var i = 0; i < 8; i += 2) {\n\t\t\tvar x = v[i] - px,\n\t\t\t\ty = v[i + 1] - py;\n\t\t\trv.push(\n\t\t\t\tx * cos - y * sin,\n\t\t\t\tx * sin + y * cos);\n\t\t}\n\t\tCurve.solveCubic(rv, 1, 0, roots, 0, 1);\n\t\treturn roots;\n\t}\n\n\tfunction addCurveLineIntersections(v1, v2, c1, c2, locations, include,\n\t\t\tflip) {\n\t\tvar x1 = v2[0], y1 = v2[1],\n\t\t\tx2 = v2[6], y2 = v2[7],\n\t\t\troots = getCurveLineIntersections(v1, x1, y1, x2 - x1, y2 - y1);\n\t\tfor (var i = 0, l = roots.length; i < l; i++) {\n\t\t\tvar t1 = roots[i],\n\t\t\t\tp1 = Curve.getPoint(v1, t1),\n\t\t\t\tt2 = Curve.getTimeOf(v2, p1);\n\t\t\tif (t2 !== null) {\n\t\t\t\taddLocation(locations, include,\n\t\t\t\t\t\tflip ? c2 : c1, flip ? t2 : t1,\n\t\t\t\t\t\tflip ? c1 : c2, flip ? t1 : t2);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction addLineIntersection(v1, v2, c1, c2, locations, include) {\n\t\tvar pt = Line.intersect(\n\t\t\t\tv1[0], v1[1], v1[6], v1[7],\n\t\t\t\tv2[0], v2[1], v2[6], v2[7]);\n\t\tif (pt) {\n\t\t\taddLocation(locations, include,\n\t\t\t\t\tc1, Curve.getTimeOf(v1, pt),\n\t\t\t\t\tc2, Curve.getTimeOf(v2, pt));\n\t\t}\n\t}\n\n\tfunction getCurveIntersections(v1, v2, c1, c2, locations, include) {\n\t\tvar epsilon = 1e-12,\n\t\t\tmin = Math.min,\n\t\t\tmax = Math.max;\n\n\t\tif (max(v1[0], v1[2], v1[4], v1[6]) + epsilon >\n\t\t\tmin(v2[0], v2[2], v2[4], v2[6]) &&\n\t\t\tmin(v1[0], v1[2], v1[4], v1[6]) - epsilon <\n\t\t\tmax(v2[0], v2[2], v2[4], v2[6]) &&\n\t\t\tmax(v1[1], v1[3], v1[5], v1[7]) + epsilon >\n\t\t\tmin(v2[1], v2[3], v2[5], v2[7]) &&\n\t\t\tmin(v1[1], v1[3], v1[5], v1[7]) - epsilon <\n\t\t\tmax(v2[1], v2[3], v2[5], v2[7])) {\n\t\t\tvar overlaps = getOverlaps(v1, v2);\n\t\t\tif (overlaps) {\n\t\t\t\tfor (var i = 0; i < 2; i++) {\n\t\t\t\t\tvar overlap = overlaps[i];\n\t\t\t\t\taddLocation(locations, include,\n\t\t\t\t\t\t\tc1, overlap[0],\n\t\t\t\t\t\t\tc2, overlap[1], true);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar straight1 = Curve.isStraight(v1),\n\t\t\t\t\tstraight2 = Curve.isStraight(v2),\n\t\t\t\t\tstraight = straight1 && straight2,\n\t\t\t\t\tflip = straight1 && !straight2,\n\t\t\t\t\tbefore = locations.length;\n\t\t\t\t(straight\n\t\t\t\t\t? addLineIntersection\n\t\t\t\t\t: straight1 || straight2\n\t\t\t\t\t\t? addCurveLineIntersections\n\t\t\t\t\t\t: addCurveIntersections)(\n\t\t\t\t\t\t\tflip ? v2 : v1, flip ? v1 : v2,\n\t\t\t\t\t\t\tflip ? c2 : c1, flip ? c1 : c2,\n\t\t\t\t\t\t\tlocations, include, flip,\n\t\t\t\t\t\t\t0, 0, 0, 1, 0, 1);\n\t\t\t\tif (!straight || locations.length === before) {\n\t\t\t\t\tfor (var i = 0; i < 4; i++) {\n\t\t\t\t\t\tvar t1 = i >> 1,\n\t\t\t\t\t\t\tt2 = i & 1,\n\t\t\t\t\t\t\ti1 = t1 * 6,\n\t\t\t\t\t\t\ti2 = t2 * 6,\n\t\t\t\t\t\t\tp1 = new Point(v1[i1], v1[i1 + 1]),\n\t\t\t\t\t\t\tp2 = new Point(v2[i2], v2[i2 + 1]);\n\t\t\t\t\t\tif (p1.isClose(p2, epsilon)) {\n\t\t\t\t\t\t\taddLocation(locations, include,\n\t\t\t\t\t\t\t\t\tc1, t1,\n\t\t\t\t\t\t\t\t\tc2, t2);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn locations;\n\t}\n\n\tfunction getSelfIntersection(v1, c1, locations, include) {\n\t\tvar info = Curve.classify(v1);\n\t\tif (info.type === 'loop') {\n\t\t\tvar roots = info.roots;\n\t\t\taddLocation(locations, include,\n\t\t\t\t\tc1, roots[0],\n\t\t\t\t\tc1, roots[1]);\n\t\t}\n\t return locations;\n\t}\n\n\tfunction getIntersections(curves1, curves2, include, matrix1, matrix2,\n\t\t\t_returnFirst) {\n\t\tvar epsilon = 1e-7,\n\t\t\tself = !curves2;\n\t\tif (self)\n\t\t\tcurves2 = curves1;\n\t\tvar length1 = curves1.length,\n\t\t\tlength2 = curves2.length,\n\t\t\tvalues1 = new Array(length1),\n\t\t\tvalues2 = self ? values1 : new Array(length2),\n\t\t\tlocations = [];\n\n\t\tfor (var i = 0; i < length1; i++) {\n\t\t\tvalues1[i] = curves1[i].getValues(matrix1);\n\t\t}\n\t\tif (!self) {\n\t\t\tfor (var i = 0; i < length2; i++) {\n\t\t\t\tvalues2[i] = curves2[i].getValues(matrix2);\n\t\t\t}\n\t\t}\n\t\tvar boundsCollisions = CollisionDetection.findCurveBoundsCollisions(\n\t\t\t\tvalues1, values2, epsilon);\n\t\tfor (var index1 = 0; index1 < length1; index1++) {\n\t\t\tvar curve1 = curves1[index1],\n\t\t\t\tv1 = values1[index1];\n\t\t\tif (self) {\n\t\t\t\tgetSelfIntersection(v1, curve1, locations, include);\n\t\t\t}\n\t\t\tvar collisions1 = boundsCollisions[index1];\n\t\t\tif (collisions1) {\n\t\t\t\tfor (var j = 0; j < collisions1.length; j++) {\n\t\t\t\t\tif (_returnFirst && locations.length)\n\t\t\t\t\t\treturn locations;\n\t\t\t\t\tvar index2 = collisions1[j];\n\t\t\t\t\tif (!self || index2 > index1) {\n\t\t\t\t\t\tvar curve2 = curves2[index2],\n\t\t\t\t\t\t\tv2 = values2[index2];\n\t\t\t\t\t\tgetCurveIntersections(\n\t\t\t\t\t\t\t\tv1, v2, curve1, curve2, locations, include);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn locations;\n\t}\n\n\tfunction getOverlaps(v1, v2) {\n\n\t\tfunction getSquaredLineLength(v) {\n\t\t\tvar x = v[6] - v[0],\n\t\t\t\ty = v[7] - v[1];\n\t\t\treturn x * x + y * y;\n\t\t}\n\n\t\tvar abs = Math.abs,\n\t\t\tgetDistance = Line.getDistance,\n\t\t\ttimeEpsilon = 1e-8,\n\t\t\tgeomEpsilon = 1e-7,\n\t\t\tstraight1 = Curve.isStraight(v1),\n\t\t\tstraight2 = Curve.isStraight(v2),\n\t\t\tstraightBoth = straight1 && straight2,\n\t\t\tflip = getSquaredLineLength(v1) < getSquaredLineLength(v2),\n\t\t\tl1 = flip ? v2 : v1,\n\t\t\tl2 = flip ? v1 : v2,\n\t\t\tpx = l1[0], py = l1[1],\n\t\t\tvx = l1[6] - px, vy = l1[7] - py;\n\t\tif (getDistance(px, py, vx, vy, l2[0], l2[1], true) < geomEpsilon &&\n\t\t\tgetDistance(px, py, vx, vy, l2[6], l2[7], true) < geomEpsilon) {\n\t\t\tif (!straightBoth &&\n\t\t\t\tgetDistance(px, py, vx, vy, l1[2], l1[3], true) < geomEpsilon &&\n\t\t\t\tgetDistance(px, py, vx, vy, l1[4], l1[5], true) < geomEpsilon &&\n\t\t\t\tgetDistance(px, py, vx, vy, l2[2], l2[3], true) < geomEpsilon &&\n\t\t\t\tgetDistance(px, py, vx, vy, l2[4], l2[5], true) < geomEpsilon) {\n\t\t\t\tstraight1 = straight2 = straightBoth = true;\n\t\t\t}\n\t\t} else if (straightBoth) {\n\t\t\treturn null;\n\t\t}\n\t\tif (straight1 ^ straight2) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar v = [v1, v2],\n\t\t\tpairs = [];\n\t\tfor (var i = 0; i < 4 && pairs.length < 2; i++) {\n\t\t\tvar i1 = i & 1,\n\t\t\t\ti2 = i1 ^ 1,\n\t\t\t\tt1 = i >> 1,\n\t\t\t\tt2 = Curve.getTimeOf(v[i1], new Point(\n\t\t\t\t\tv[i2][t1 ? 6 : 0],\n\t\t\t\t\tv[i2][t1 ? 7 : 1]));\n\t\t\tif (t2 != null) {\n\t\t\t\tvar pair = i1 ? [t1, t2] : [t2, t1];\n\t\t\t\tif (!pairs.length ||\n\t\t\t\t\tabs(pair[0] - pairs[0][0]) > timeEpsilon &&\n\t\t\t\t\tabs(pair[1] - pairs[0][1]) > timeEpsilon) {\n\t\t\t\t\tpairs.push(pair);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (i > 2 && !pairs.length)\n\t\t\t\tbreak;\n\t\t}\n\t\tif (pairs.length !== 2) {\n\t\t\tpairs = null;\n\t\t} else if (!straightBoth) {\n\t\t\tvar o1 = Curve.getPart(v1, pairs[0][0], pairs[1][0]),\n\t\t\t\to2 = Curve.getPart(v2, pairs[0][1], pairs[1][1]);\n\t\t\tif (abs(o2[2] - o1[2]) > geomEpsilon ||\n\t\t\t\tabs(o2[3] - o1[3]) > geomEpsilon ||\n\t\t\t\tabs(o2[4] - o1[4]) > geomEpsilon ||\n\t\t\t\tabs(o2[5] - o1[5]) > geomEpsilon)\n\t\t\t\tpairs = null;\n\t\t}\n\t\treturn pairs;\n\t}\n\n\tfunction getTimesWithTangent(v, tangent) {\n\t\tvar x0 = v[0], y0 = v[1],\n\t\t\tx1 = v[2], y1 = v[3],\n\t\t\tx2 = v[4], y2 = v[5],\n\t\t\tx3 = v[6], y3 = v[7],\n\t\t\tnormalized = tangent.normalize(),\n\t\t\ttx = normalized.x,\n\t\t\tty = normalized.y,\n\t\t\tax = 3 * x3 - 9 * x2 + 9 * x1 - 3 * x0,\n\t\t\tay = 3 * y3 - 9 * y2 + 9 * y1 - 3 * y0,\n\t\t\tbx = 6 * x2 - 12 * x1 + 6 * x0,\n\t\t\tby = 6 * y2 - 12 * y1 + 6 * y0,\n\t\t\tcx = 3 * x1 - 3 * x0,\n\t\t\tcy = 3 * y1 - 3 * y0,\n\t\t\tden = 2 * ax * ty - 2 * ay * tx,\n\t\t\ttimes = [];\n\t\tif (Math.abs(den) < Numerical.CURVETIME_EPSILON) {\n\t\t\tvar num = ax * cy - ay * cx,\n\t\t\t\tden = ax * by - ay * bx;\n\t\t\tif (den != 0) {\n\t\t\t\tvar t = -num / den;\n\t\t\t\tif (t >= 0 && t <= 1) times.push(t);\n\t\t\t}\n\t\t} else {\n\t\t\tvar delta = (bx * bx - 4 * ax * cx) * ty * ty +\n\t\t\t\t(-2 * bx * by + 4 * ay * cx + 4 * ax * cy) * tx * ty +\n\t\t\t\t(by * by - 4 * ay * cy) * tx * tx,\n\t\t\t\tk = bx * ty - by * tx;\n\t\t\tif (delta >= 0 && den != 0) {\n\t\t\t\tvar d = Math.sqrt(delta),\n\t\t\t\t\tt0 = -(k + d) / den,\n\t\t\t\t\tt1 = (-k + d) / den;\n\t\t\t\tif (t0 >= 0 && t0 <= 1) times.push(t0);\n\t\t\t\tif (t1 >= 0 && t1 <= 1) times.push(t1);\n\t\t\t}\n\t\t}\n\t\treturn times;\n\t}\n\n\treturn {\n\t\tgetIntersections: function(curve) {\n\t\t\tvar v1 = this.getValues(),\n\t\t\t\tv2 = curve && curve !== this && curve.getValues();\n\t\t\treturn v2 ? getCurveIntersections(v1, v2, this, curve, [])\n\t\t\t\t\t : getSelfIntersection(v1, this, []);\n\t\t},\n\n\t\tstatics: {\n\t\t\tgetOverlaps: getOverlaps,\n\t\t\tgetIntersections: getIntersections,\n\t\t\tgetCurveLineIntersections: getCurveLineIntersections,\n\t\t\tgetTimesWithTangent: getTimesWithTangent\n\t\t}\n\t};\n});\n\nvar CurveLocation = Base.extend({\n\t_class: 'CurveLocation',\n\n\tinitialize: function CurveLocation(curve, time, point, _overlap, _distance) {\n\t\tif (time >= 0.99999999) {\n\t\t\tvar next = curve.getNext();\n\t\t\tif (next) {\n\t\t\t\ttime = 0;\n\t\t\t\tcurve = next;\n\t\t\t}\n\t\t}\n\t\tthis._setCurve(curve);\n\t\tthis._time = time;\n\t\tthis._point = point || curve.getPointAtTime(time);\n\t\tthis._overlap = _overlap;\n\t\tthis._distance = _distance;\n\t\tthis._intersection = this._next = this._previous = null;\n\t},\n\n\t_setPath: function(path) {\n\t\tthis._path = path;\n\t\tthis._version = path ? path._version : 0;\n\t},\n\n\t_setCurve: function(curve) {\n\t\tthis._setPath(curve._path);\n\t\tthis._curve = curve;\n\t\tthis._segment = null;\n\t\tthis._segment1 = curve._segment1;\n\t\tthis._segment2 = curve._segment2;\n\t},\n\n\t_setSegment: function(segment) {\n\t\tvar curve = segment.getCurve();\n\t\tif (curve) {\n\t\t\tthis._setCurve(curve);\n\t\t} else {\n\t\t\tthis._setPath(segment._path);\n\t\t\tthis._segment1 = segment;\n\t\t\tthis._segment2 = null;\n\t\t}\n\t\tthis._segment = segment;\n\t\tthis._time = segment === this._segment1 ? 0 : 1;\n\t\tthis._point = segment._point.clone();\n\t},\n\n\tgetSegment: function() {\n\t\tvar segment = this._segment;\n\t\tif (!segment) {\n\t\t\tvar curve = this.getCurve(),\n\t\t\t\ttime = this.getTime();\n\t\t\tif (time === 0) {\n\t\t\t\tsegment = curve._segment1;\n\t\t\t} else if (time === 1) {\n\t\t\t\tsegment = curve._segment2;\n\t\t\t} else if (time != null) {\n\t\t\t\tsegment = curve.getPartLength(0, time)\n\t\t\t\t\t< curve.getPartLength(time, 1)\n\t\t\t\t\t\t? curve._segment1\n\t\t\t\t\t\t: curve._segment2;\n\t\t\t}\n\t\t\tthis._segment = segment;\n\t\t}\n\t\treturn segment;\n\t},\n\n\tgetCurve: function() {\n\t\tvar path = this._path,\n\t\t\tthat = this;\n\t\tif (path && path._version !== this._version) {\n\t\t\tthis._time = this._offset = this._curveOffset = this._curve = null;\n\t\t}\n\n\t\tfunction trySegment(segment) {\n\t\t\tvar curve = segment && segment.getCurve();\n\t\t\tif (curve && (that._time = curve.getTimeOf(that._point)) != null) {\n\t\t\t\tthat._setCurve(curve);\n\t\t\t\treturn curve;\n\t\t\t}\n\t\t}\n\n\t\treturn this._curve\n\t\t\t|| trySegment(this._segment)\n\t\t\t|| trySegment(this._segment1)\n\t\t\t|| trySegment(this._segment2.getPrevious());\n\t},\n\n\tgetPath: function() {\n\t\tvar curve = this.getCurve();\n\t\treturn curve && curve._path;\n\t},\n\n\tgetIndex: function() {\n\t\tvar curve = this.getCurve();\n\t\treturn curve && curve.getIndex();\n\t},\n\n\tgetTime: function() {\n\t\tvar curve = this.getCurve(),\n\t\t\ttime = this._time;\n\t\treturn curve && time == null\n\t\t\t? this._time = curve.getTimeOf(this._point)\n\t\t\t: time;\n\t},\n\n\tgetParameter: '#getTime',\n\n\tgetPoint: function() {\n\t\treturn this._point;\n\t},\n\n\tgetOffset: function() {\n\t\tvar offset = this._offset;\n\t\tif (offset == null) {\n\t\t\toffset = 0;\n\t\t\tvar path = this.getPath(),\n\t\t\t\tindex = this.getIndex();\n\t\t\tif (path && index != null) {\n\t\t\t\tvar curves = path.getCurves();\n\t\t\t\tfor (var i = 0; i < index; i++)\n\t\t\t\t\toffset += curves[i].getLength();\n\t\t\t}\n\t\t\tthis._offset = offset += this.getCurveOffset();\n\t\t}\n\t\treturn offset;\n\t},\n\n\tgetCurveOffset: function() {\n\t\tvar offset = this._curveOffset;\n\t\tif (offset == null) {\n\t\t\tvar curve = this.getCurve(),\n\t\t\t\ttime = this.getTime();\n\t\t\tthis._curveOffset = offset = time != null && curve\n\t\t\t\t\t&& curve.getPartLength(0, time);\n\t\t}\n\t\treturn offset;\n\t},\n\n\tgetIntersection: function() {\n\t\treturn this._intersection;\n\t},\n\n\tgetDistance: function() {\n\t\treturn this._distance;\n\t},\n\n\tdivide: function() {\n\t\tvar curve = this.getCurve(),\n\t\t\tres = curve && curve.divideAtTime(this.getTime());\n\t\tif (res) {\n\t\t\tthis._setSegment(res._segment1);\n\t\t}\n\t\treturn res;\n\t},\n\n\tsplit: function() {\n\t\tvar curve = this.getCurve(),\n\t\t\tpath = curve._path,\n\t\t\tres = curve && curve.splitAtTime(this.getTime());\n\t\tif (res) {\n\t\t\tthis._setSegment(path.getLastSegment());\n\t\t}\n\t\treturn res;\n\t},\n\n\tequals: function(loc, _ignoreOther) {\n\t\tvar res = this === loc;\n\t\tif (!res && loc instanceof CurveLocation) {\n\t\t\tvar c1 = this.getCurve(),\n\t\t\t\tc2 = loc.getCurve(),\n\t\t\t\tp1 = c1._path,\n\t\t\t\tp2 = c2._path;\n\t\t\tif (p1 === p2) {\n\t\t\t\tvar abs = Math.abs,\n\t\t\t\t\tepsilon = 1e-7,\n\t\t\t\t\tdiff = abs(this.getOffset() - loc.getOffset()),\n\t\t\t\t\ti1 = !_ignoreOther && this._intersection,\n\t\t\t\t\ti2 = !_ignoreOther && loc._intersection;\n\t\t\t\tres = (diff < epsilon\n\t\t\t\t\t\t|| p1 && abs(p1.getLength() - diff) < epsilon)\n\t\t\t\t\t&& (!i1 && !i2 || i1 && i2 && i1.equals(i2, true));\n\t\t\t}\n\t\t}\n\t\treturn res;\n\t},\n\n\ttoString: function() {\n\t\tvar parts = [],\n\t\t\tpoint = this.getPoint(),\n\t\t\tf = Formatter.instance;\n\t\tif (point)\n\t\t\tparts.push('point: ' + point);\n\t\tvar index = this.getIndex();\n\t\tif (index != null)\n\t\t\tparts.push('index: ' + index);\n\t\tvar time = this.getTime();\n\t\tif (time != null)\n\t\t\tparts.push('time: ' + f.number(time));\n\t\tif (this._distance != null)\n\t\t\tparts.push('distance: ' + f.number(this._distance));\n\t\treturn '{ ' + parts.join(', ') + ' }';\n\t},\n\n\tisTouching: function() {\n\t\tvar inter = this._intersection;\n\t\tif (inter && this.getTangent().isCollinear(inter.getTangent())) {\n\t\t\tvar curve1 = this.getCurve(),\n\t\t\t\tcurve2 = inter.getCurve();\n\t\t\treturn !(curve1.isStraight() && curve2.isStraight()\n\t\t\t\t\t&& curve1.getLine().intersect(curve2.getLine()));\n\t\t}\n\t\treturn false;\n\t},\n\n\tisCrossing: function() {\n\t\tvar inter = this._intersection;\n\t\tif (!inter)\n\t\t\treturn false;\n\t\tvar t1 = this.getTime(),\n\t\t\tt2 = inter.getTime(),\n\t\t\ttMin = 1e-8,\n\t\t\ttMax = 1 - tMin,\n\t\t\tt1Inside = t1 >= tMin && t1 <= tMax,\n\t\t\tt2Inside = t2 >= tMin && t2 <= tMax;\n\t\tif (t1Inside && t2Inside)\n\t\t\treturn !this.isTouching();\n\t\tvar c2 = this.getCurve(),\n\t\t\tc1 = c2 && t1 < tMin ? c2.getPrevious() : c2,\n\t\t\tc4 = inter.getCurve(),\n\t\t\tc3 = c4 && t2 < tMin ? c4.getPrevious() : c4;\n\t\tif (t1 > tMax)\n\t\t\tc2 = c2.getNext();\n\t\tif (t2 > tMax)\n\t\t\tc4 = c4.getNext();\n\t\tif (!c1 || !c2 || !c3 || !c4)\n\t\t\treturn false;\n\n\t\tvar offsets = [];\n\n\t\tfunction addOffsets(curve, end) {\n\t\t\tvar v = curve.getValues(),\n\t\t\t\troots = Curve.classify(v).roots || Curve.getPeaks(v),\n\t\t\t\tcount = roots.length,\n\t\t\t\toffset = Curve.getLength(v,\n\t\t\t\t\tend && count ? roots[count - 1] : 0,\n\t\t\t\t\t!end && count ? roots[0] : 1);\n\t\t\toffsets.push(count ? offset : offset / 32);\n\t\t}\n\n\t\tfunction isInRange(angle, min, max) {\n\t\t\treturn min < max\n\t\t\t\t\t? angle > min && angle < max\n\t\t\t\t\t: angle > min || angle < max;\n\t\t}\n\n\t\tif (!t1Inside) {\n\t\t\taddOffsets(c1, true);\n\t\t\taddOffsets(c2, false);\n\t\t}\n\t\tif (!t2Inside) {\n\t\t\taddOffsets(c3, true);\n\t\t\taddOffsets(c4, false);\n\t\t}\n\t\tvar pt = this.getPoint(),\n\t\t\toffset = Math.min.apply(Math, offsets),\n\t\t\tv2 = t1Inside ? c2.getTangentAtTime(t1)\n\t\t\t\t\t: c2.getPointAt(offset).subtract(pt),\n\t\t\tv1 = t1Inside ? v2.negate()\n\t\t\t\t\t: c1.getPointAt(-offset).subtract(pt),\n\t\t\tv4 = t2Inside ? c4.getTangentAtTime(t2)\n\t\t\t\t\t: c4.getPointAt(offset).subtract(pt),\n\t\t\tv3 = t2Inside ? v4.negate()\n\t\t\t\t\t: c3.getPointAt(-offset).subtract(pt),\n\t\t\ta1 = v1.getAngle(),\n\t\t\ta2 = v2.getAngle(),\n\t\t\ta3 = v3.getAngle(),\n\t\t\ta4 = v4.getAngle();\n\t\treturn !!(t1Inside\n\t\t\t\t? (isInRange(a1, a3, a4) ^ isInRange(a2, a3, a4)) &&\n\t\t\t\t (isInRange(a1, a4, a3) ^ isInRange(a2, a4, a3))\n\t\t\t\t: (isInRange(a3, a1, a2) ^ isInRange(a4, a1, a2)) &&\n\t\t\t\t (isInRange(a3, a2, a1) ^ isInRange(a4, a2, a1)));\n\t},\n\n\thasOverlap: function() {\n\t\treturn !!this._overlap;\n\t}\n}, Base.each(Curve._evaluateMethods, function(name) {\n\tvar get = name + 'At';\n\tthis[name] = function() {\n\t\tvar curve = this.getCurve(),\n\t\t\ttime = this.getTime();\n\t\treturn time != null && curve && curve[get](time, true);\n\t};\n}, {\n\tpreserve: true\n}),\nnew function() {\n\n\tfunction insert(locations, loc, merge) {\n\t\tvar length = locations.length,\n\t\t\tl = 0,\n\t\t\tr = length - 1;\n\n\t\tfunction search(index, dir) {\n\t\t\tfor (var i = index + dir; i >= -1 && i <= length; i += dir) {\n\t\t\t\tvar loc2 = locations[((i % length) + length) % length];\n\t\t\t\tif (!loc.getPoint().isClose(loc2.getPoint(),\n\t\t\t\t\t\t1e-7))\n\t\t\t\t\tbreak;\n\t\t\t\tif (loc.equals(loc2))\n\t\t\t\t\treturn loc2;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\twhile (l <= r) {\n\t\t\tvar m = (l + r) >>> 1,\n\t\t\t\tloc2 = locations[m],\n\t\t\t\tfound;\n\t\t\tif (merge && (found = loc.equals(loc2) ? loc2\n\t\t\t\t\t: (search(m, -1) || search(m, 1)))) {\n\t\t\t\tif (loc._overlap) {\n\t\t\t\t\tfound._overlap = found._intersection._overlap = true;\n\t\t\t\t}\n\t\t\t\treturn found;\n\t\t\t}\n\t\tvar path1 = loc.getPath(),\n\t\t\tpath2 = loc2.getPath(),\n\t\t\tdiff = path1 !== path2\n\t\t\t\t? path1._id - path2._id\n\t\t\t\t: (loc.getIndex() + loc.getTime())\n\t\t\t\t- (loc2.getIndex() + loc2.getTime());\n\t\t\tif (diff < 0) {\n\t\t\t\tr = m - 1;\n\t\t\t} else {\n\t\t\t\tl = m + 1;\n\t\t\t}\n\t\t}\n\t\tlocations.splice(l, 0, loc);\n\t\treturn loc;\n\t}\n\n\treturn { statics: {\n\t\tinsert: insert,\n\n\t\texpand: function(locations) {\n\t\t\tvar expanded = locations.slice();\n\t\t\tfor (var i = locations.length - 1; i >= 0; i--) {\n\t\t\t\tinsert(expanded, locations[i]._intersection, false);\n\t\t\t}\n\t\t\treturn expanded;\n\t\t}\n\t}};\n});\n\nvar PathItem = Item.extend({\n\t_class: 'PathItem',\n\t_selectBounds: false,\n\t_canScaleStroke: true,\n\tbeans: true,\n\n\tinitialize: function PathItem() {\n\t},\n\n\tstatics: {\n\t\tcreate: function(arg) {\n\t\t\tvar data,\n\t\t\t\tsegments,\n\t\t\t\tcompound;\n\t\t\tif (Base.isPlainObject(arg)) {\n\t\t\t\tsegments = arg.segments;\n\t\t\t\tdata = arg.pathData;\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tsegments = arg;\n\t\t\t} else if (typeof arg === 'string') {\n\t\t\t\tdata = arg;\n\t\t\t}\n\t\t\tif (segments) {\n\t\t\t\tvar first = segments[0];\n\t\t\t\tcompound = first && Array.isArray(first[0]);\n\t\t\t} else if (data) {\n\t\t\t\tcompound = (data.match(/m/gi) || []).length > 1\n\t\t\t\t\t\t|| /z\\s*\\S+/i.test(data);\n\t\t\t}\n\t\t\tvar ctor = compound ? CompoundPath : Path;\n\t\t\treturn new ctor(arg);\n\t\t}\n\t},\n\n\t_asPathItem: function() {\n\t\treturn this;\n\t},\n\n\tisClockwise: function() {\n\t\treturn this.getArea() >= 0;\n\t},\n\n\tsetClockwise: function(clockwise) {\n\t\tif (this.isClockwise() != (clockwise = !!clockwise))\n\t\t\tthis.reverse();\n\t},\n\n\tsetPathData: function(data) {\n\n\t\tvar parts = data && data.match(/[mlhvcsqtaz][^mlhvcsqtaz]*/ig),\n\t\t\tcoords,\n\t\t\trelative = false,\n\t\t\tprevious,\n\t\t\tcontrol,\n\t\t\tcurrent = new Point(),\n\t\t\tstart = new Point();\n\n\t\tfunction getCoord(index, coord) {\n\t\t\tvar val = +coords[index];\n\t\t\tif (relative)\n\t\t\t\tval += current[coord];\n\t\t\treturn val;\n\t\t}\n\n\t\tfunction getPoint(index) {\n\t\t\treturn new Point(\n\t\t\t\tgetCoord(index, 'x'),\n\t\t\t\tgetCoord(index + 1, 'y')\n\t\t\t);\n\t\t}\n\n\t\tthis.clear();\n\n\t\tfor (var i = 0, l = parts && parts.length; i < l; i++) {\n\t\t\tvar part = parts[i],\n\t\t\t\tcommand = part[0],\n\t\t\t\tlower = command.toLowerCase();\n\t\t\tcoords = part.match(/[+-]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][+-]?\\d+)?/g);\n\t\t\tvar length = coords && coords.length;\n\t\t\trelative = command === lower;\n\t\t\tif (previous === 'z' && !/[mz]/.test(lower))\n\t\t\t\tthis.moveTo(current);\n\t\t\tswitch (lower) {\n\t\t\tcase 'm':\n\t\t\tcase 'l':\n\t\t\t\tvar move = lower === 'm';\n\t\t\t\tfor (var j = 0; j < length; j += 2) {\n\t\t\t\t\tthis[move ? 'moveTo' : 'lineTo'](current = getPoint(j));\n\t\t\t\t\tif (move) {\n\t\t\t\t\t\tstart = current;\n\t\t\t\t\t\tmove = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontrol = current;\n\t\t\t\tbreak;\n\t\t\tcase 'h':\n\t\t\tcase 'v':\n\t\t\t\tvar coord = lower === 'h' ? 'x' : 'y';\n\t\t\t\tcurrent = current.clone();\n\t\t\t\tfor (var j = 0; j < length; j++) {\n\t\t\t\t\tcurrent[coord] = getCoord(j, coord);\n\t\t\t\t\tthis.lineTo(current);\n\t\t\t\t}\n\t\t\t\tcontrol = current;\n\t\t\t\tbreak;\n\t\t\tcase 'c':\n\t\t\t\tfor (var j = 0; j < length; j += 6) {\n\t\t\t\t\tthis.cubicCurveTo(\n\t\t\t\t\t\t\tgetPoint(j),\n\t\t\t\t\t\t\tcontrol = getPoint(j + 2),\n\t\t\t\t\t\t\tcurrent = getPoint(j + 4));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 's':\n\t\t\t\tfor (var j = 0; j < length; j += 4) {\n\t\t\t\t\tthis.cubicCurveTo(\n\t\t\t\t\t\t\t/[cs]/.test(previous)\n\t\t\t\t\t\t\t\t\t? current.multiply(2).subtract(control)\n\t\t\t\t\t\t\t\t\t: current,\n\t\t\t\t\t\t\tcontrol = getPoint(j),\n\t\t\t\t\t\t\tcurrent = getPoint(j + 2));\n\t\t\t\t\tprevious = lower;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'q':\n\t\t\t\tfor (var j = 0; j < length; j += 4) {\n\t\t\t\t\tthis.quadraticCurveTo(\n\t\t\t\t\t\t\tcontrol = getPoint(j),\n\t\t\t\t\t\t\tcurrent = getPoint(j + 2));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 't':\n\t\t\t\tfor (var j = 0; j < length; j += 2) {\n\t\t\t\t\tthis.quadraticCurveTo(\n\t\t\t\t\t\t\tcontrol = (/[qt]/.test(previous)\n\t\t\t\t\t\t\t\t\t? current.multiply(2).subtract(control)\n\t\t\t\t\t\t\t\t\t: current),\n\t\t\t\t\t\t\tcurrent = getPoint(j));\n\t\t\t\t\tprevious = lower;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'a':\n\t\t\t\tfor (var j = 0; j < length; j += 7) {\n\t\t\t\t\tthis.arcTo(current = getPoint(j + 5),\n\t\t\t\t\t\t\tnew Size(+coords[j], +coords[j + 1]),\n\t\t\t\t\t\t\t+coords[j + 2], +coords[j + 4], +coords[j + 3]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'z':\n\t\t\t\tthis.closePath(1e-12);\n\t\t\t\tcurrent = start;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tprevious = lower;\n\t\t}\n\t},\n\n\t_canComposite: function() {\n\t\treturn !(this.hasFill() && this.hasStroke());\n\t},\n\n\t_contains: function(point) {\n\t\tvar winding = point.isInside(\n\t\t\t\tthis.getBounds({ internal: true, handle: true }))\n\t\t\t\t\t? this._getWinding(point)\n\t\t\t\t\t: {};\n\t\treturn winding.onPath || !!(this.getFillRule() === 'evenodd'\n\t\t\t\t? winding.windingL & 1 || winding.windingR & 1\n\t\t\t\t: winding.winding);\n\t},\n\n\tgetIntersections: function(path, include, _matrix, _returnFirst) {\n\t\tvar self = this === path || !path,\n\t\t\tmatrix1 = this._matrix._orNullIfIdentity(),\n\t\t\tmatrix2 = self ? matrix1\n\t\t\t\t: (_matrix || path._matrix)._orNullIfIdentity();\n\t\treturn self || this.getBounds(matrix1).intersects(\n\t\t\t\tpath.getBounds(matrix2), 1e-12)\n\t\t\t\t? Curve.getIntersections(\n\t\t\t\t\t\tthis.getCurves(), !self && path.getCurves(), include,\n\t\t\t\t\t\tmatrix1, matrix2, _returnFirst)\n\t\t\t\t: [];\n\t},\n\n\tgetCrossings: function(path) {\n\t\treturn this.getIntersections(path, function(inter) {\n\t\t\treturn inter.isCrossing();\n\t\t});\n\t},\n\n\tgetNearestLocation: function() {\n\t\tvar point = Point.read(arguments),\n\t\t\tcurves = this.getCurves(),\n\t\t\tminDist = Infinity,\n\t\t\tminLoc = null;\n\t\tfor (var i = 0, l = curves.length; i < l; i++) {\n\t\t\tvar loc = curves[i].getNearestLocation(point);\n\t\t\tif (loc._distance < minDist) {\n\t\t\t\tminDist = loc._distance;\n\t\t\t\tminLoc = loc;\n\t\t\t}\n\t\t}\n\t\treturn minLoc;\n\t},\n\n\tgetNearestPoint: function() {\n\t\tvar loc = this.getNearestLocation.apply(this, arguments);\n\t\treturn loc ? loc.getPoint() : loc;\n\t},\n\n\tinterpolate: function(from, to, factor) {\n\t\tvar isPath = !this._children,\n\t\t\tname = isPath ? '_segments' : '_children',\n\t\t\titemsFrom = from[name],\n\t\t\titemsTo = to[name],\n\t\t\titems = this[name];\n\t\tif (!itemsFrom || !itemsTo || itemsFrom.length !== itemsTo.length) {\n\t\t\tthrow new Error('Invalid operands in interpolate() call: ' +\n\t\t\t\t\tfrom + ', ' + to);\n\t\t}\n\t\tvar current = items.length,\n\t\t\tlength = itemsTo.length;\n\t\tif (current < length) {\n\t\t\tvar ctor = isPath ? Segment : Path;\n\t\t\tfor (var i = current; i < length; i++) {\n\t\t\t\tthis.add(new ctor());\n\t\t\t}\n\t\t} else if (current > length) {\n\t\t\tthis[isPath ? 'removeSegments' : 'removeChildren'](length, current);\n\t\t}\n\t\tfor (var i = 0; i < length; i++) {\n\t\t\titems[i].interpolate(itemsFrom[i], itemsTo[i], factor);\n\t\t}\n\t\tif (isPath) {\n\t\t\tthis.setClosed(from._closed);\n\t\t\tthis._changed(9);\n\t\t}\n\t},\n\n\tcompare: function(path) {\n\t\tvar ok = false;\n\t\tif (path) {\n\t\t\tvar paths1 = this._children || [this],\n\t\t\t\tpaths2 = path._children ? path._children.slice() : [path],\n\t\t\t\tlength1 = paths1.length,\n\t\t\t\tlength2 = paths2.length,\n\t\t\t\tmatched = [],\n\t\t\t\tcount = 0;\n\t\t\tok = true;\n\t\t\tvar boundsOverlaps = CollisionDetection.findItemBoundsCollisions(paths1, paths2, Numerical.GEOMETRIC_EPSILON);\n\t\t\tfor (var i1 = length1 - 1; i1 >= 0 && ok; i1--) {\n\t\t\t\tvar path1 = paths1[i1];\n\t\t\t\tok = false;\n\t\t\t\tvar pathBoundsOverlaps = boundsOverlaps[i1];\n\t\t\t\tif (pathBoundsOverlaps) {\n\t\t\t\t\tfor (var i2 = pathBoundsOverlaps.length - 1; i2 >= 0 && !ok; i2--) {\n\t\t\t\t\t\tif (path1.compare(paths2[pathBoundsOverlaps[i2]])) {\n\t\t\t\t\t\t\tif (!matched[pathBoundsOverlaps[i2]]) {\n\t\t\t\t\t\t\t\tmatched[pathBoundsOverlaps[i2]] = true;\n\t\t\t\t\t\t\t\tcount++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tok = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tok = ok && count === length2;\n\t\t}\n\t\treturn ok;\n\t},\n\n});\n\nvar Path = PathItem.extend({\n\t_class: 'Path',\n\t_serializeFields: {\n\t\tsegments: [],\n\t\tclosed: false\n\t},\n\n\tinitialize: function Path(arg) {\n\t\tthis._closed = false;\n\t\tthis._segments = [];\n\t\tthis._version = 0;\n\t\tvar args = arguments,\n\t\t\tsegments = Array.isArray(arg)\n\t\t\t? typeof arg[0] === 'object'\n\t\t\t\t? arg\n\t\t\t\t: args\n\t\t\t: arg && (arg.size === undefined && (arg.x !== undefined\n\t\t\t\t\t|| arg.point !== undefined))\n\t\t\t\t? args\n\t\t\t\t: null;\n\t\tif (segments && segments.length > 0) {\n\t\t\tthis.setSegments(segments);\n\t\t} else {\n\t\t\tthis._curves = undefined;\n\t\t\tthis._segmentSelection = 0;\n\t\t\tif (!segments && typeof arg === 'string') {\n\t\t\t\tthis.setPathData(arg);\n\t\t\t\targ = null;\n\t\t\t}\n\t\t}\n\t\tthis._initialize(!segments && arg);\n\t},\n\n\t_equals: function(item) {\n\t\treturn this._closed === item._closed\n\t\t\t\t&& Base.equals(this._segments, item._segments);\n\t},\n\n\tcopyContent: function(source) {\n\t\tthis.setSegments(source._segments);\n\t\tthis._closed = source._closed;\n\t},\n\n\t_changed: function _changed(flags) {\n\t\t_changed.base.call(this, flags);\n\t\tif (flags & 8) {\n\t\t\tthis._length = this._area = undefined;\n\t\t\tif (flags & 32) {\n\t\t\t\tthis._version++;\n\t\t\t} else if (this._curves) {\n\t\t\t for (var i = 0, l = this._curves.length; i < l; i++)\n\t\t\t\t\tthis._curves[i]._changed();\n\t\t\t}\n\t\t} else if (flags & 64) {\n\t\t\tthis._bounds = undefined;\n\t\t}\n\t},\n\n\tgetStyle: function() {\n\t\tvar parent = this._parent;\n\t\treturn (parent instanceof CompoundPath ? parent : this)._style;\n\t},\n\n\tgetSegments: function() {\n\t\treturn this._segments;\n\t},\n\n\tsetSegments: function(segments) {\n\t\tvar fullySelected = this.isFullySelected(),\n\t\t\tlength = segments && segments.length;\n\t\tthis._segments.length = 0;\n\t\tthis._segmentSelection = 0;\n\t\tthis._curves = undefined;\n\t\tif (length) {\n\t\t\tvar last = segments[length - 1];\n\t\t\tif (typeof last === 'boolean') {\n\t\t\t\tthis.setClosed(last);\n\t\t\t\tlength--;\n\t\t\t}\n\t\t\tthis._add(Segment.readList(segments, 0, {}, length));\n\t\t}\n\t\tif (fullySelected)\n\t\t\tthis.setFullySelected(true);\n\t},\n\n\tgetFirstSegment: function() {\n\t\treturn this._segments[0];\n\t},\n\n\tgetLastSegment: function() {\n\t\treturn this._segments[this._segments.length - 1];\n\t},\n\n\tgetCurves: function() {\n\t\tvar curves = this._curves,\n\t\t\tsegments = this._segments;\n\t\tif (!curves) {\n\t\t\tvar length = this._countCurves();\n\t\t\tcurves = this._curves = new Array(length);\n\t\t\tfor (var i = 0; i < length; i++)\n\t\t\t\tcurves[i] = new Curve(this, segments[i],\n\t\t\t\t\tsegments[i + 1] || segments[0]);\n\t\t}\n\t\treturn curves;\n\t},\n\n\tgetFirstCurve: function() {\n\t\treturn this.getCurves()[0];\n\t},\n\n\tgetLastCurve: function() {\n\t\tvar curves = this.getCurves();\n\t\treturn curves[curves.length - 1];\n\t},\n\n\tisClosed: function() {\n\t\treturn this._closed;\n\t},\n\n\tsetClosed: function(closed) {\n\t\tif (this._closed != (closed = !!closed)) {\n\t\t\tthis._closed = closed;\n\t\t\tif (this._curves) {\n\t\t\t\tvar length = this._curves.length = this._countCurves();\n\t\t\t\tif (closed)\n\t\t\t\t\tthis._curves[length - 1] = new Curve(this,\n\t\t\t\t\t\tthis._segments[length - 1], this._segments[0]);\n\t\t\t}\n\t\t\tthis._changed(41);\n\t\t}\n\t}\n}, {\n\tbeans: true,\n\n\tgetPathData: function(_matrix, _precision) {\n\t\tvar segments = this._segments,\n\t\t\tlength = segments.length,\n\t\t\tf = new Formatter(_precision),\n\t\t\tcoords = new Array(6),\n\t\t\tfirst = true,\n\t\t\tcurX, curY,\n\t\t\tprevX, prevY,\n\t\t\tinX, inY,\n\t\t\toutX, outY,\n\t\t\tparts = [];\n\n\t\tfunction addSegment(segment, skipLine) {\n\t\t\tsegment._transformCoordinates(_matrix, coords);\n\t\t\tcurX = coords[0];\n\t\t\tcurY = coords[1];\n\t\t\tif (first) {\n\t\t\t\tparts.push('M' + f.pair(curX, curY));\n\t\t\t\tfirst = false;\n\t\t\t} else {\n\t\t\t\tinX = coords[2];\n\t\t\t\tinY = coords[3];\n\t\t\t\tif (inX === curX && inY === curY\n\t\t\t\t\t\t&& outX === prevX && outY === prevY) {\n\t\t\t\t\tif (!skipLine) {\n\t\t\t\t\t\tvar dx = curX - prevX,\n\t\t\t\t\t\t\tdy = curY - prevY;\n\t\t\t\t\t\tparts.push(\n\t\t\t\t\t\t\t dx === 0 ? 'v' + f.number(dy)\n\t\t\t\t\t\t\t: dy === 0 ? 'h' + f.number(dx)\n\t\t\t\t\t\t\t: 'l' + f.pair(dx, dy));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tparts.push('c' + f.pair(outX - prevX, outY - prevY)\n\t\t\t\t\t\t\t + ' ' + f.pair( inX - prevX, inY - prevY)\n\t\t\t\t\t\t\t + ' ' + f.pair(curX - prevX, curY - prevY));\n\t\t\t\t}\n\t\t\t}\n\t\t\tprevX = curX;\n\t\t\tprevY = curY;\n\t\t\toutX = coords[4];\n\t\t\toutY = coords[5];\n\t\t}\n\n\t\tif (!length)\n\t\t\treturn '';\n\n\t\tfor (var i = 0; i < length; i++)\n\t\t\taddSegment(segments[i]);\n\t\tif (this._closed && length > 0) {\n\t\t\taddSegment(segments[0], true);\n\t\t\tparts.push('z');\n\t\t}\n\t\treturn parts.join('');\n\t},\n\n\tisEmpty: function() {\n\t\treturn !this._segments.length;\n\t},\n\n\t_transformContent: function(matrix) {\n\t\tvar segments = this._segments,\n\t\t\tcoords = new Array(6);\n\t\tfor (var i = 0, l = segments.length; i < l; i++)\n\t\t\tsegments[i]._transformCoordinates(matrix, coords, true);\n\t\treturn true;\n\t},\n\n\t_add: function(segs, index) {\n\t\tvar segments = this._segments,\n\t\t\tcurves = this._curves,\n\t\t\tamount = segs.length,\n\t\t\tappend = index == null,\n\t\t\tindex = append ? segments.length : index;\n\t\tfor (var i = 0; i < amount; i++) {\n\t\t\tvar segment = segs[i];\n\t\t\tif (segment._path)\n\t\t\t\tsegment = segs[i] = segment.clone();\n\t\t\tsegment._path = this;\n\t\t\tsegment._index = index + i;\n\t\t\tif (segment._selection)\n\t\t\t\tthis._updateSelection(segment, 0, segment._selection);\n\t\t}\n\t\tif (append) {\n\t\t\tBase.push(segments, segs);\n\t\t} else {\n\t\t\tsegments.splice.apply(segments, [index, 0].concat(segs));\n\t\t\tfor (var i = index + amount, l = segments.length; i < l; i++)\n\t\t\t\tsegments[i]._index = i;\n\t\t}\n\t\tif (curves) {\n\t\t\tvar total = this._countCurves(),\n\t\t\t\tstart = index > 0 && index + amount - 1 === total ? index - 1\n\t\t\t\t\t: index,\n\t\t\t\tinsert = start,\n\t\t\t\tend = Math.min(start + amount, total);\n\t\t\tif (segs._curves) {\n\t\t\t\tcurves.splice.apply(curves, [start, 0].concat(segs._curves));\n\t\t\t\tinsert += segs._curves.length;\n\t\t\t}\n\t\t\tfor (var i = insert; i < end; i++)\n\t\t\t\tcurves.splice(i, 0, new Curve(this, null, null));\n\t\t\tthis._adjustCurves(start, end);\n\t\t}\n\t\tthis._changed(41);\n\t\treturn segs;\n\t},\n\n\t_adjustCurves: function(start, end) {\n\t\tvar segments = this._segments,\n\t\t\tcurves = this._curves,\n\t\t\tcurve;\n\t\tfor (var i = start; i < end; i++) {\n\t\t\tcurve = curves[i];\n\t\t\tcurve._path = this;\n\t\t\tcurve._segment1 = segments[i];\n\t\t\tcurve._segment2 = segments[i + 1] || segments[0];\n\t\t\tcurve._changed();\n\t\t}\n\t\tif (curve = curves[this._closed && !start ? segments.length - 1\n\t\t\t\t: start - 1]) {\n\t\t\tcurve._segment2 = segments[start] || segments[0];\n\t\t\tcurve._changed();\n\t\t}\n\t\tif (curve = curves[end]) {\n\t\t\tcurve._segment1 = segments[end];\n\t\t\tcurve._changed();\n\t\t}\n\t},\n\n\t_countCurves: function() {\n\t\tvar length = this._segments.length;\n\t\treturn !this._closed && length > 0 ? length - 1 : length;\n\t},\n\n\tadd: function(segment1 ) {\n\t\tvar args = arguments;\n\t\treturn args.length > 1 && typeof segment1 !== 'number'\n\t\t\t? this._add(Segment.readList(args))\n\t\t\t: this._add([ Segment.read(args) ])[0];\n\t},\n\n\tinsert: function(index, segment1 ) {\n\t\tvar args = arguments;\n\t\treturn args.length > 2 && typeof segment1 !== 'number'\n\t\t\t? this._add(Segment.readList(args, 1), index)\n\t\t\t: this._add([ Segment.read(args, 1) ], index)[0];\n\t},\n\n\taddSegment: function() {\n\t\treturn this._add([ Segment.read(arguments) ])[0];\n\t},\n\n\tinsertSegment: function(index ) {\n\t\treturn this._add([ Segment.read(arguments, 1) ], index)[0];\n\t},\n\n\taddSegments: function(segments) {\n\t\treturn this._add(Segment.readList(segments));\n\t},\n\n\tinsertSegments: function(index, segments) {\n\t\treturn this._add(Segment.readList(segments), index);\n\t},\n\n\tremoveSegment: function(index) {\n\t\treturn this.removeSegments(index, index + 1)[0] || null;\n\t},\n\n\tremoveSegments: function(start, end, _includeCurves) {\n\t\tstart = start || 0;\n\t\tend = Base.pick(end, this._segments.length);\n\t\tvar segments = this._segments,\n\t\t\tcurves = this._curves,\n\t\t\tcount = segments.length,\n\t\t\tremoved = segments.splice(start, end - start),\n\t\t\tamount = removed.length;\n\t\tif (!amount)\n\t\t\treturn removed;\n\t\tfor (var i = 0; i < amount; i++) {\n\t\t\tvar segment = removed[i];\n\t\t\tif (segment._selection)\n\t\t\t\tthis._updateSelection(segment, segment._selection, 0);\n\t\t\tsegment._index = segment._path = null;\n\t\t}\n\t\tfor (var i = start, l = segments.length; i < l; i++)\n\t\t\tsegments[i]._index = i;\n\t\tif (curves) {\n\t\t\tvar index = start > 0 && end === count + (this._closed ? 1 : 0)\n\t\t\t\t\t? start - 1\n\t\t\t\t\t: start,\n\t\t\t\tcurves = curves.splice(index, amount);\n\t\t\tfor (var i = curves.length - 1; i >= 0; i--)\n\t\t\t\tcurves[i]._path = null;\n\t\t\tif (_includeCurves)\n\t\t\t\tremoved._curves = curves.slice(1);\n\t\t\tthis._adjustCurves(index, index);\n\t\t}\n\t\tthis._changed(41);\n\t\treturn removed;\n\t},\n\n\tclear: '#removeSegments',\n\n\thasHandles: function() {\n\t\tvar segments = this._segments;\n\t\tfor (var i = 0, l = segments.length; i < l; i++) {\n\t\t\tif (segments[i].hasHandles())\n\t\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},\n\n\tclearHandles: function() {\n\t\tvar segments = this._segments;\n\t\tfor (var i = 0, l = segments.length; i < l; i++)\n\t\t\tsegments[i].clearHandles();\n\t},\n\n\tgetLength: function() {\n\t\tif (this._length == null) {\n\t\t\tvar curves = this.getCurves(),\n\t\t\t\tlength = 0;\n\t\t\tfor (var i = 0, l = curves.length; i < l; i++)\n\t\t\t\tlength += curves[i].getLength();\n\t\t\tthis._length = length;\n\t\t}\n\t\treturn this._length;\n\t},\n\n\tgetArea: function() {\n\t\tvar area = this._area;\n\t\tif (area == null) {\n\t\t\tvar segments = this._segments,\n\t\t\t\tclosed = this._closed;\n\t\t\tarea = 0;\n\t\t\tfor (var i = 0, l = segments.length; i < l; i++) {\n\t\t\t\tvar last = i + 1 === l;\n\t\t\t\tarea += Curve.getArea(Curve.getValues(\n\t\t\t\t\t\tsegments[i], segments[last ? 0 : i + 1],\n\t\t\t\t\t\tnull, last && !closed));\n\t\t\t}\n\t\t\tthis._area = area;\n\t\t}\n\t\treturn area;\n\t},\n\n\tisFullySelected: function() {\n\t\tvar length = this._segments.length;\n\t\treturn this.isSelected() && length > 0 && this._segmentSelection\n\t\t\t\t=== length * 7;\n\t},\n\n\tsetFullySelected: function(selected) {\n\t\tif (selected)\n\t\t\tthis._selectSegments(true);\n\t\tthis.setSelected(selected);\n\t},\n\n\tsetSelection: function setSelection(selection) {\n\t\tif (!(selection & 1))\n\t\t\tthis._selectSegments(false);\n\t\tsetSelection.base.call(this, selection);\n\t},\n\n\t_selectSegments: function(selected) {\n\t\tvar segments = this._segments,\n\t\t\tlength = segments.length,\n\t\t\tselection = selected ? 7 : 0;\n\t\tthis._segmentSelection = selection * length;\n\t\tfor (var i = 0; i < length; i++)\n\t\t\tsegments[i]._selection = selection;\n\t},\n\n\t_updateSelection: function(segment, oldSelection, newSelection) {\n\t\tsegment._selection = newSelection;\n\t\tvar selection = this._segmentSelection += newSelection - oldSelection;\n\t\tif (selection > 0)\n\t\t\tthis.setSelected(true);\n\t},\n\n\tdivideAt: function(location) {\n\t\tvar loc = this.getLocationAt(location),\n\t\t\tcurve;\n\t\treturn loc && (curve = loc.getCurve().divideAt(loc.getCurveOffset()))\n\t\t\t\t? curve._segment1\n\t\t\t\t: null;\n\t},\n\n\tsplitAt: function(location) {\n\t\tvar loc = this.getLocationAt(location),\n\t\t\tindex = loc && loc.index,\n\t\t\ttime = loc && loc.time,\n\t\t\ttMin = 1e-8,\n\t\t\ttMax = 1 - tMin;\n\t\tif (time > tMax) {\n\t\t\tindex++;\n\t\t\ttime = 0;\n\t\t}\n\t\tvar curves = this.getCurves();\n\t\tif (index >= 0 && index < curves.length) {\n\t\t\tif (time >= tMin) {\n\t\t\t\tcurves[index++].divideAtTime(time);\n\t\t\t}\n\t\t\tvar segs = this.removeSegments(index, this._segments.length, true),\n\t\t\t\tpath;\n\t\t\tif (this._closed) {\n\t\t\t\tthis.setClosed(false);\n\t\t\t\tpath = this;\n\t\t\t} else {\n\t\t\t\tpath = new Path(Item.NO_INSERT);\n\t\t\t\tpath.insertAbove(this);\n\t\t\t\tpath.copyAttributes(this);\n\t\t\t}\n\t\t\tpath._add(segs, 0);\n\t\t\tthis.addSegment(segs[0]);\n\t\t\treturn path;\n\t\t}\n\t\treturn null;\n\t},\n\n\tsplit: function(index, time) {\n\t\tvar curve,\n\t\t\tlocation = time === undefined ? index\n\t\t\t\t: (curve = this.getCurves()[index])\n\t\t\t\t\t&& curve.getLocationAtTime(time);\n\t\treturn location != null ? this.splitAt(location) : null;\n\t},\n\n\tjoin: function(path, tolerance) {\n\t\tvar epsilon = tolerance || 0;\n\t\tif (path && path !== this) {\n\t\t\tvar segments = path._segments,\n\t\t\t\tlast1 = this.getLastSegment(),\n\t\t\t\tlast2 = path.getLastSegment();\n\t\t\tif (!last2)\n\t\t\t\treturn this;\n\t\t\tif (last1 && last1._point.isClose(last2._point, epsilon))\n\t\t\t\tpath.reverse();\n\t\t\tvar first2 = path.getFirstSegment();\n\t\t\tif (last1 && last1._point.isClose(first2._point, epsilon)) {\n\t\t\t\tlast1.setHandleOut(first2._handleOut);\n\t\t\t\tthis._add(segments.slice(1));\n\t\t\t} else {\n\t\t\t\tvar first1 = this.getFirstSegment();\n\t\t\t\tif (first1 && first1._point.isClose(first2._point, epsilon))\n\t\t\t\t\tpath.reverse();\n\t\t\t\tlast2 = path.getLastSegment();\n\t\t\t\tif (first1 && first1._point.isClose(last2._point, epsilon)) {\n\t\t\t\t\tfirst1.setHandleIn(last2._handleIn);\n\t\t\t\t\tthis._add(segments.slice(0, segments.length - 1), 0);\n\t\t\t\t} else {\n\t\t\t\t\tthis._add(segments.slice());\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (path._closed)\n\t\t\t\tthis._add([segments[0]]);\n\t\t\tpath.remove();\n\t\t}\n\t\tvar first = this.getFirstSegment(),\n\t\t\tlast = this.getLastSegment();\n\t\tif (first !== last && first._point.isClose(last._point, epsilon)) {\n\t\t\tfirst.setHandleIn(last._handleIn);\n\t\t\tlast.remove();\n\t\t\tthis.setClosed(true);\n\t\t}\n\t\treturn this;\n\t},\n\n\treduce: function(options) {\n\t\tvar curves = this.getCurves(),\n\t\t\tsimplify = options && options.simplify,\n\t\t\ttolerance = simplify ? 1e-7 : 0;\n\t\tfor (var i = curves.length - 1; i >= 0; i--) {\n\t\t\tvar curve = curves[i];\n\t\t\tif (!curve.hasHandles() && (!curve.hasLength(tolerance)\n\t\t\t\t\t|| simplify && curve.isCollinear(curve.getNext())))\n\t\t\t\tcurve.remove();\n\t\t}\n\t\treturn this;\n\t},\n\n\treverse: function() {\n\t\tthis._segments.reverse();\n\t\tfor (var i = 0, l = this._segments.length; i < l; i++) {\n\t\t\tvar segment = this._segments[i];\n\t\t\tvar handleIn = segment._handleIn;\n\t\t\tsegment._handleIn = segment._handleOut;\n\t\t\tsegment._handleOut = handleIn;\n\t\t\tsegment._index = i;\n\t\t}\n\t\tthis._curves = null;\n\t\tthis._changed(9);\n\t},\n\n\tflatten: function(flatness) {\n\t\tvar flattener = new PathFlattener(this, flatness || 0.25, 256, true),\n\t\t\tparts = flattener.parts,\n\t\t\tlength = parts.length,\n\t\t\tsegments = [];\n\t\tfor (var i = 0; i < length; i++) {\n\t\t\tsegments.push(new Segment(parts[i].curve.slice(0, 2)));\n\t\t}\n\t\tif (!this._closed && length > 0) {\n\t\t\tsegments.push(new Segment(parts[length - 1].curve.slice(6)));\n\t\t}\n\t\tthis.setSegments(segments);\n\t},\n\n\tsimplify: function(tolerance) {\n\t\tvar segments = new PathFitter(this).fit(tolerance || 2.5);\n\t\tif (segments)\n\t\t\tthis.setSegments(segments);\n\t\treturn !!segments;\n\t},\n\n\tsmooth: function(options) {\n\t\tvar that = this,\n\t\t\topts = options || {},\n\t\t\ttype = opts.type || 'asymmetric',\n\t\t\tsegments = this._segments,\n\t\t\tlength = segments.length,\n\t\t\tclosed = this._closed;\n\n\t\tfunction getIndex(value, _default) {\n\t\t\tvar index = value && value.index;\n\t\t\tif (index != null) {\n\t\t\t\tvar path = value.path;\n\t\t\t\tif (path && path !== that)\n\t\t\t\t\tthrow new Error(value._class + ' ' + index + ' of ' + path\n\t\t\t\t\t\t\t+ ' is not part of ' + that);\n\t\t\t\tif (_default && value instanceof Curve)\n\t\t\t\t\tindex++;\n\t\t\t} else {\n\t\t\t\tindex = typeof value === 'number' ? value : _default;\n\t\t\t}\n\t\t\treturn Math.min(index < 0 && closed\n\t\t\t\t\t? index % length\n\t\t\t\t\t: index < 0 ? index + length : index, length - 1);\n\t\t}\n\n\t\tvar loop = closed && opts.from === undefined && opts.to === undefined,\n\t\t\tfrom = getIndex(opts.from, 0),\n\t\t\tto = getIndex(opts.to, length - 1);\n\n\t\tif (from > to) {\n\t\t\tif (closed) {\n\t\t\t\tfrom -= length;\n\t\t\t} else {\n\t\t\t\tvar tmp = from;\n\t\t\t\tfrom = to;\n\t\t\t\tto = tmp;\n\t\t\t}\n\t\t}\n\t\tif (/^(?:asymmetric|continuous)$/.test(type)) {\n\t\t\tvar asymmetric = type === 'asymmetric',\n\t\t\t\tmin = Math.min,\n\t\t\t\tamount = to - from + 1,\n\t\t\t\tn = amount - 1,\n\t\t\t\tpadding = loop ? min(amount, 4) : 1,\n\t\t\t\tpaddingLeft = padding,\n\t\t\t\tpaddingRight = padding,\n\t\t\t\tknots = [];\n\t\t\tif (!closed) {\n\t\t\t\tpaddingLeft = min(1, from);\n\t\t\t\tpaddingRight = min(1, length - to - 1);\n\t\t\t}\n\t\t\tn += paddingLeft + paddingRight;\n\t\t\tif (n <= 1)\n\t\t\t\treturn;\n\t\t\tfor (var i = 0, j = from - paddingLeft; i <= n; i++, j++) {\n\t\t\t\tknots[i] = segments[(j < 0 ? j + length : j) % length]._point;\n\t\t\t}\n\n\t\t\tvar x = knots[0]._x + 2 * knots[1]._x,\n\t\t\t\ty = knots[0]._y + 2 * knots[1]._y,\n\t\t\t\tf = 2,\n\t\t\t\tn_1 = n - 1,\n\t\t\t\trx = [x],\n\t\t\t\try = [y],\n\t\t\t\trf = [f],\n\t\t\t\tpx = [],\n\t\t\t\tpy = [];\n\t\t\tfor (var i = 1; i < n; i++) {\n\t\t\t\tvar internal = i < n_1,\n\t\t\t\t\ta = internal ? 1 : asymmetric ? 1 : 2,\n\t\t\t\t\tb = internal ? 4 : asymmetric ? 2 : 7,\n\t\t\t\t\tu = internal ? 4 : asymmetric ? 3 : 8,\n\t\t\t\t\tv = internal ? 2 : asymmetric ? 0 : 1,\n\t\t\t\t\tm = a / f;\n\t\t\t\tf = rf[i] = b - m;\n\t\t\t\tx = rx[i] = u * knots[i]._x + v * knots[i + 1]._x - m * x;\n\t\t\t\ty = ry[i] = u * knots[i]._y + v * knots[i + 1]._y - m * y;\n\t\t\t}\n\n\t\t\tpx[n_1] = rx[n_1] / rf[n_1];\n\t\t\tpy[n_1] = ry[n_1] / rf[n_1];\n\t\t\tfor (var i = n - 2; i >= 0; i--) {\n\t\t\t\tpx[i] = (rx[i] - px[i + 1]) / rf[i];\n\t\t\t\tpy[i] = (ry[i] - py[i + 1]) / rf[i];\n\t\t\t}\n\t\t\tpx[n] = (3 * knots[n]._x - px[n_1]) / 2;\n\t\t\tpy[n] = (3 * knots[n]._y - py[n_1]) / 2;\n\n\t\t\tfor (var i = paddingLeft, max = n - paddingRight, j = from;\n\t\t\t\t\ti <= max; i++, j++) {\n\t\t\t\tvar segment = segments[j < 0 ? j + length : j],\n\t\t\t\t\tpt = segment._point,\n\t\t\t\t\thx = px[i] - pt._x,\n\t\t\t\t\thy = py[i] - pt._y;\n\t\t\t\tif (loop || i < max)\n\t\t\t\t\tsegment.setHandleOut(hx, hy);\n\t\t\t\tif (loop || i > paddingLeft)\n\t\t\t\t\tsegment.setHandleIn(-hx, -hy);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (var i = from; i <= to; i++) {\n\t\t\t\tsegments[i < 0 ? i + length : i].smooth(opts,\n\t\t\t\t\t\t!loop && i === from, !loop && i === to);\n\t\t\t}\n\t\t}\n\t},\n\n\ttoShape: function(insert) {\n\t\tif (!this._closed)\n\t\t\treturn null;\n\n\t\tvar segments = this._segments,\n\t\t\ttype,\n\t\t\tsize,\n\t\t\tradius,\n\t\t\ttopCenter;\n\n\t\tfunction isCollinear(i, j) {\n\t\t\tvar seg1 = segments[i],\n\t\t\t\tseg2 = seg1.getNext(),\n\t\t\t\tseg3 = segments[j],\n\t\t\t\tseg4 = seg3.getNext();\n\t\t\treturn seg1._handleOut.isZero() && seg2._handleIn.isZero()\n\t\t\t\t\t&& seg3._handleOut.isZero() && seg4._handleIn.isZero()\n\t\t\t\t\t&& seg2._point.subtract(seg1._point).isCollinear(\n\t\t\t\t\t\tseg4._point.subtract(seg3._point));\n\t\t}\n\n\t\tfunction isOrthogonal(i) {\n\t\t\tvar seg2 = segments[i],\n\t\t\t\tseg1 = seg2.getPrevious(),\n\t\t\t\tseg3 = seg2.getNext();\n\t\t\treturn seg1._handleOut.isZero() && seg2._handleIn.isZero()\n\t\t\t\t\t&& seg2._handleOut.isZero() && seg3._handleIn.isZero()\n\t\t\t\t\t&& seg2._point.subtract(seg1._point).isOrthogonal(\n\t\t\t\t\t\tseg3._point.subtract(seg2._point));\n\t\t}\n\n\t\tfunction isArc(i) {\n\t\t\tvar seg1 = segments[i],\n\t\t\t\tseg2 = seg1.getNext(),\n\t\t\t\thandle1 = seg1._handleOut,\n\t\t\t\thandle2 = seg2._handleIn,\n\t\t\t\tkappa = 0.5522847498307936;\n\t\t\tif (handle1.isOrthogonal(handle2)) {\n\t\t\t\tvar pt1 = seg1._point,\n\t\t\t\t\tpt2 = seg2._point,\n\t\t\t\t\tcorner = new Line(pt1, handle1, true).intersect(\n\t\t\t\t\t\t\tnew Line(pt2, handle2, true), true);\n\t\t\t\treturn corner && Numerical.isZero(handle1.getLength() /\n\t\t\t\t\t\tcorner.subtract(pt1).getLength() - kappa)\n\t\t\t\t\t&& Numerical.isZero(handle2.getLength() /\n\t\t\t\t\t\tcorner.subtract(pt2).getLength() - kappa);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tfunction getDistance(i, j) {\n\t\t\treturn segments[i]._point.getDistance(segments[j]._point);\n\t\t}\n\n\t\tif (!this.hasHandles() && segments.length === 4\n\t\t\t\t&& isCollinear(0, 2) && isCollinear(1, 3) && isOrthogonal(1)) {\n\t\t\ttype = Shape.Rectangle;\n\t\t\tsize = new Size(getDistance(0, 3), getDistance(0, 1));\n\t\t\ttopCenter = segments[1]._point.add(segments[2]._point).divide(2);\n\t\t} else if (segments.length === 8 && isArc(0) && isArc(2) && isArc(4)\n\t\t\t\t&& isArc(6) && isCollinear(1, 5) && isCollinear(3, 7)) {\n\t\t\ttype = Shape.Rectangle;\n\t\t\tsize = new Size(getDistance(1, 6), getDistance(0, 3));\n\t\t\tradius = size.subtract(new Size(getDistance(0, 7),\n\t\t\t\t\tgetDistance(1, 2))).divide(2);\n\t\t\ttopCenter = segments[3]._point.add(segments[4]._point).divide(2);\n\t\t} else if (segments.length === 4\n\t\t\t\t&& isArc(0) && isArc(1) && isArc(2) && isArc(3)) {\n\t\t\tif (Numerical.isZero(getDistance(0, 2) - getDistance(1, 3))) {\n\t\t\t\ttype = Shape.Circle;\n\t\t\t\tradius = getDistance(0, 2) / 2;\n\t\t\t} else {\n\t\t\t\ttype = Shape.Ellipse;\n\t\t\t\tradius = new Size(getDistance(2, 0) / 2, getDistance(3, 1) / 2);\n\t\t\t}\n\t\t\ttopCenter = segments[1]._point;\n\t\t}\n\n\t\tif (type) {\n\t\t\tvar center = this.getPosition(true),\n\t\t\t\tshape = new type({\n\t\t\t\t\tcenter: center,\n\t\t\t\t\tsize: size,\n\t\t\t\t\tradius: radius,\n\t\t\t\t\tinsert: false\n\t\t\t\t});\n\t\t\tshape.copyAttributes(this, true);\n\t\t\tshape._matrix.prepend(this._matrix);\n\t\t\tshape.rotate(topCenter.subtract(center).getAngle() + 90);\n\t\t\tif (insert === undefined || insert)\n\t\t\t\tshape.insertAbove(this);\n\t\t\treturn shape;\n\t\t}\n\t\treturn null;\n\t},\n\n\ttoPath: '#clone',\n\n\tcompare: function compare(path) {\n\t\tif (!path || path instanceof CompoundPath)\n\t\t\treturn compare.base.call(this, path);\n\t\tvar curves1 = this.getCurves(),\n\t\t\tcurves2 = path.getCurves(),\n\t\t\tlength1 = curves1.length,\n\t\t\tlength2 = curves2.length;\n\t\tif (!length1 || !length2) {\n\t\t\treturn length1 == length2;\n\t\t}\n\t\tvar v1 = curves1[0].getValues(),\n\t\t\tvalues2 = [],\n\t\t\tpos1 = 0, pos2,\n\t\t\tend1 = 0, end2;\n\t\tfor (var i = 0; i < length2; i++) {\n\t\t\tvar v2 = curves2[i].getValues();\n\t\t\tvalues2.push(v2);\n\t\t\tvar overlaps = Curve.getOverlaps(v1, v2);\n\t\t\tif (overlaps) {\n\t\t\t\tpos2 = !i && overlaps[0][0] > 0 ? length2 - 1 : i;\n\t\t\t\tend2 = overlaps[0][1];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tvar abs = Math.abs,\n\t\t\tepsilon = 1e-8,\n\t\t\tv2 = values2[pos2],\n\t\t\tstart2;\n\t\twhile (v1 && v2) {\n\t\t\tvar overlaps = Curve.getOverlaps(v1, v2);\n\t\t\tif (overlaps) {\n\t\t\t\tvar t1 = overlaps[0][0];\n\t\t\t\tif (abs(t1 - end1) < epsilon) {\n\t\t\t\t\tend1 = overlaps[1][0];\n\t\t\t\t\tif (end1 === 1) {\n\t\t\t\t\t\tv1 = ++pos1 < length1 ? curves1[pos1].getValues() : null;\n\t\t\t\t\t\tend1 = 0;\n\t\t\t\t\t}\n\t\t\t\t\tvar t2 = overlaps[0][1];\n\t\t\t\t\tif (abs(t2 - end2) < epsilon) {\n\t\t\t\t\t\tif (!start2)\n\t\t\t\t\t\t\tstart2 = [pos2, t2];\n\t\t\t\t\t\tend2 = overlaps[1][1];\n\t\t\t\t\t\tif (end2 === 1) {\n\t\t\t\t\t\t\tif (++pos2 >= length2)\n\t\t\t\t\t\t\t\tpos2 = 0;\n\t\t\t\t\t\t\tv2 = values2[pos2] || curves2[pos2].getValues();\n\t\t\t\t\t\t\tend2 = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!v1) {\n\t\t\t\t\t\t\treturn start2[0] === pos2 && start2[1] === end2;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\treturn false;\n\t},\n\n\t_hitTestSelf: function(point, options, viewMatrix, strokeMatrix) {\n\t\tvar that = this,\n\t\t\tstyle = this.getStyle(),\n\t\t\tsegments = this._segments,\n\t\t\tnumSegments = segments.length,\n\t\t\tclosed = this._closed,\n\t\t\ttolerancePadding = options._tolerancePadding,\n\t\t\tstrokePadding = tolerancePadding,\n\t\t\tjoin, cap, miterLimit,\n\t\t\tarea, loc, res,\n\t\t\thitStroke = options.stroke && style.hasStroke(),\n\t\t\thitFill = options.fill && style.hasFill(),\n\t\t\thitCurves = options.curves,\n\t\t\tstrokeRadius = hitStroke\n\t\t\t\t\t? style.getStrokeWidth() / 2\n\t\t\t\t\t: hitFill && options.tolerance > 0 || hitCurves\n\t\t\t\t\t\t? 0 : null;\n\t\tif (strokeRadius !== null) {\n\t\t\tif (strokeRadius > 0) {\n\t\t\t\tjoin = style.getStrokeJoin();\n\t\t\t\tcap = style.getStrokeCap();\n\t\t\t\tmiterLimit = style.getMiterLimit();\n\t\t\t\tstrokePadding = strokePadding.add(\n\t\t\t\t\tPath._getStrokePadding(strokeRadius, strokeMatrix));\n\t\t\t} else {\n\t\t\t\tjoin = cap = 'round';\n\t\t\t}\n\t\t}\n\n\t\tfunction isCloseEnough(pt, padding) {\n\t\t\treturn point.subtract(pt).divide(padding).length <= 1;\n\t\t}\n\n\t\tfunction checkSegmentPoint(seg, pt, name) {\n\t\t\tif (!options.selected || pt.isSelected()) {\n\t\t\t\tvar anchor = seg._point;\n\t\t\t\tif (pt !== anchor)\n\t\t\t\t\tpt = pt.add(anchor);\n\t\t\t\tif (isCloseEnough(pt, strokePadding)) {\n\t\t\t\t\treturn new HitResult(name, that, {\n\t\t\t\t\t\tsegment: seg,\n\t\t\t\t\t\tpoint: pt\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction checkSegmentPoints(seg, ends) {\n\t\t\treturn (ends || options.segments)\n\t\t\t\t&& checkSegmentPoint(seg, seg._point, 'segment')\n\t\t\t\t|| (!ends && options.handles) && (\n\t\t\t\t\tcheckSegmentPoint(seg, seg._handleIn, 'handle-in') ||\n\t\t\t\t\tcheckSegmentPoint(seg, seg._handleOut, 'handle-out'));\n\t\t}\n\n\t\tfunction addToArea(point) {\n\t\t\tarea.add(point);\n\t\t}\n\n\t\tfunction checkSegmentStroke(segment) {\n\t\t\tvar isJoin = closed || segment._index > 0\n\t\t\t\t\t&& segment._index < numSegments - 1;\n\t\t\tif ((isJoin ? join : cap) === 'round') {\n\t\t\t\treturn isCloseEnough(segment._point, strokePadding);\n\t\t\t} else {\n\t\t\t\tarea = new Path({ internal: true, closed: true });\n\t\t\t\tif (isJoin) {\n\t\t\t\t\tif (!segment.isSmooth()) {\n\t\t\t\t\t\tPath._addBevelJoin(segment, join, strokeRadius,\n\t\t\t\t\t\t\t miterLimit, null, strokeMatrix, addToArea, true);\n\t\t\t\t\t}\n\t\t\t\t} else if (cap === 'square') {\n\t\t\t\t\tPath._addSquareCap(segment, cap, strokeRadius, null,\n\t\t\t\t\t\t\tstrokeMatrix, addToArea, true);\n\t\t\t\t}\n\t\t\t\tif (!area.isEmpty()) {\n\t\t\t\t\tvar loc;\n\t\t\t\t\treturn area.contains(point)\n\t\t\t\t\t\t|| (loc = area.getNearestLocation(point))\n\t\t\t\t\t\t\t&& isCloseEnough(loc.getPoint(), tolerancePadding);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (options.ends && !options.segments && !closed) {\n\t\t\tif (res = checkSegmentPoints(segments[0], true)\n\t\t\t\t\t|| checkSegmentPoints(segments[numSegments - 1], true))\n\t\t\t\treturn res;\n\t\t} else if (options.segments || options.handles) {\n\t\t\tfor (var i = 0; i < numSegments; i++)\n\t\t\t\tif (res = checkSegmentPoints(segments[i]))\n\t\t\t\t\treturn res;\n\t\t}\n\t\tif (strokeRadius !== null) {\n\t\t\tloc = this.getNearestLocation(point);\n\t\t\tif (loc) {\n\t\t\t\tvar time = loc.getTime();\n\t\t\t\tif (time === 0 || time === 1 && numSegments > 1) {\n\t\t\t\t\tif (!checkSegmentStroke(loc.getSegment()))\n\t\t\t\t\t\tloc = null;\n\t\t\t\t} else if (!isCloseEnough(loc.getPoint(), strokePadding)) {\n\t\t\t\t\tloc = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!loc && join === 'miter' && numSegments > 1) {\n\t\t\t\tfor (var i = 0; i < numSegments; i++) {\n\t\t\t\t\tvar segment = segments[i];\n\t\t\t\t\tif (point.getDistance(segment._point)\n\t\t\t\t\t\t\t<= miterLimit * strokeRadius\n\t\t\t\t\t\t\t&& checkSegmentStroke(segment)) {\n\t\t\t\t\t\tloc = segment.getLocation();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn !loc && hitFill && this._contains(point)\n\t\t\t\t|| loc && !hitStroke && !hitCurves\n\t\t\t\t\t? new HitResult('fill', this)\n\t\t\t\t\t: loc\n\t\t\t\t\t\t? new HitResult(hitStroke ? 'stroke' : 'curve', this, {\n\t\t\t\t\t\t\tlocation: loc,\n\t\t\t\t\t\t\tpoint: loc.getPoint()\n\t\t\t\t\t\t})\n\t\t\t\t\t\t: null;\n\t}\n\n}, Base.each(Curve._evaluateMethods,\n\tfunction(name) {\n\t\tthis[name + 'At'] = function(offset) {\n\t\t\tvar loc = this.getLocationAt(offset);\n\t\t\treturn loc && loc[name]();\n\t\t};\n\t},\n{\n\tbeans: false,\n\n\tgetLocationOf: function() {\n\t\tvar point = Point.read(arguments),\n\t\t\tcurves = this.getCurves();\n\t\tfor (var i = 0, l = curves.length; i < l; i++) {\n\t\t\tvar loc = curves[i].getLocationOf(point);\n\t\t\tif (loc)\n\t\t\t\treturn loc;\n\t\t}\n\t\treturn null;\n\t},\n\n\tgetOffsetOf: function() {\n\t\tvar loc = this.getLocationOf.apply(this, arguments);\n\t\treturn loc ? loc.getOffset() : null;\n\t},\n\n\tgetLocationAt: function(offset) {\n\t\tif (typeof offset === 'number') {\n\t\t\tvar curves = this.getCurves(),\n\t\t\t\tlength = 0;\n\t\t\tfor (var i = 0, l = curves.length; i < l; i++) {\n\t\t\t\tvar start = length,\n\t\t\t\t\tcurve = curves[i];\n\t\t\t\tlength += curve.getLength();\n\t\t\t\tif (length > offset) {\n\t\t\t\t\treturn curve.getLocationAt(offset - start);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (curves.length > 0 && offset <= this.getLength()) {\n\t\t\t\treturn new CurveLocation(curves[curves.length - 1], 1);\n\t\t\t}\n\t\t} else if (offset && offset.getPath && offset.getPath() === this) {\n\t\t\treturn offset;\n\t\t}\n\t\treturn null;\n\t},\n\n\tgetOffsetsWithTangent: function() {\n\t\tvar tangent = Point.read(arguments);\n\t\tif (tangent.isZero()) {\n\t\t\treturn [];\n\t\t}\n\n\t\tvar offsets = [];\n\t\tvar curveStart = 0;\n\t\tvar curves = this.getCurves();\n\t\tfor (var i = 0, l = curves.length; i < l; i++) {\n\t\t\tvar curve = curves[i];\n\t\t\tvar curveTimes = curve.getTimesWithTangent(tangent);\n\t\t\tfor (var j = 0, m = curveTimes.length; j < m; j++) {\n\t\t\t\tvar offset = curveStart + curve.getOffsetAtTime(curveTimes[j]);\n\t\t\t\tif (offsets.indexOf(offset) < 0) {\n\t\t\t\t\toffsets.push(offset);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcurveStart += curve.length;\n\t\t}\n\t\treturn offsets;\n\t}\n}),\nnew function() {\n\n\tfunction drawHandles(ctx, segments, matrix, size) {\n\t\tif (size <= 0) return;\n\n\t\tvar half = size / 2,\n\t\t\tminiSize = size - 2,\n\t\t\tminiHalf = half - 1,\n\t\t\tcoords = new Array(6),\n\t\t\tpX, pY;\n\n\t\tfunction drawHandle(index) {\n\t\t\tvar hX = coords[index],\n\t\t\t\thY = coords[index + 1];\n\t\t\tif (pX != hX || pY != hY) {\n\t\t\t\tctx.beginPath();\n\t\t\t\tctx.moveTo(pX, pY);\n\t\t\t\tctx.lineTo(hX, hY);\n\t\t\t\tctx.stroke();\n\t\t\t\tctx.beginPath();\n\t\t\t\tctx.arc(hX, hY, half, 0, Math.PI * 2, true);\n\t\t\t\tctx.fill();\n\t\t\t}\n\t\t}\n\n\t\tfor (var i = 0, l = segments.length; i < l; i++) {\n\t\t\tvar segment = segments[i],\n\t\t\t\tselection = segment._selection;\n\t\t\tsegment._transformCoordinates(matrix, coords);\n\t\t\tpX = coords[0];\n\t\t\tpY = coords[1];\n\t\t\tif (selection & 2)\n\t\t\t\tdrawHandle(2);\n\t\t\tif (selection & 4)\n\t\t\t\tdrawHandle(4);\n\t\t\tctx.fillRect(pX - half, pY - half, size, size);\n\t\t\tif (miniSize > 0 && !(selection & 1)) {\n\t\t\t\tvar fillStyle = ctx.fillStyle;\n\t\t\t\tctx.fillStyle = '#ffffff';\n\t\t\t\tctx.fillRect(pX - miniHalf, pY - miniHalf, miniSize, miniSize);\n\t\t\t\tctx.fillStyle = fillStyle;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction drawSegments(ctx, path, matrix) {\n\t\tvar segments = path._segments,\n\t\t\tlength = segments.length,\n\t\t\tcoords = new Array(6),\n\t\t\tfirst = true,\n\t\t\tcurX, curY,\n\t\t\tprevX, prevY,\n\t\t\tinX, inY,\n\t\t\toutX, outY;\n\n\t\tfunction drawSegment(segment) {\n\t\t\tif (matrix) {\n\t\t\t\tsegment._transformCoordinates(matrix, coords);\n\t\t\t\tcurX = coords[0];\n\t\t\t\tcurY = coords[1];\n\t\t\t} else {\n\t\t\t\tvar point = segment._point;\n\t\t\t\tcurX = point._x;\n\t\t\t\tcurY = point._y;\n\t\t\t}\n\t\t\tif (first) {\n\t\t\t\tctx.moveTo(curX, curY);\n\t\t\t\tfirst = false;\n\t\t\t} else {\n\t\t\t\tif (matrix) {\n\t\t\t\t\tinX = coords[2];\n\t\t\t\t\tinY = coords[3];\n\t\t\t\t} else {\n\t\t\t\t\tvar handle = segment._handleIn;\n\t\t\t\t\tinX = curX + handle._x;\n\t\t\t\t\tinY = curY + handle._y;\n\t\t\t\t}\n\t\t\t\tif (inX === curX && inY === curY\n\t\t\t\t\t\t&& outX === prevX && outY === prevY) {\n\t\t\t\t\tctx.lineTo(curX, curY);\n\t\t\t\t} else {\n\t\t\t\t\tctx.bezierCurveTo(outX, outY, inX, inY, curX, curY);\n\t\t\t\t}\n\t\t\t}\n\t\t\tprevX = curX;\n\t\t\tprevY = curY;\n\t\t\tif (matrix) {\n\t\t\t\toutX = coords[4];\n\t\t\t\toutY = coords[5];\n\t\t\t} else {\n\t\t\t\tvar handle = segment._handleOut;\n\t\t\t\toutX = prevX + handle._x;\n\t\t\t\toutY = prevY + handle._y;\n\t\t\t}\n\t\t}\n\n\t\tfor (var i = 0; i < length; i++)\n\t\t\tdrawSegment(segments[i]);\n\t\tif (path._closed && length > 0)\n\t\t\tdrawSegment(segments[0]);\n\t}\n\n\treturn {\n\t\t_draw: function(ctx, param, viewMatrix, strokeMatrix) {\n\t\t\tvar dontStart = param.dontStart,\n\t\t\t\tdontPaint = param.dontFinish || param.clip,\n\t\t\t\tstyle = this.getStyle(),\n\t\t\t\thasFill = style.hasFill(),\n\t\t\t\thasStroke = style.hasStroke(),\n\t\t\t\tdashArray = style.getDashArray(),\n\t\t\t\tdashLength = !paper.support.nativeDash && hasStroke\n\t\t\t\t\t\t&& dashArray && dashArray.length;\n\n\t\t\tif (!dontStart)\n\t\t\t\tctx.beginPath();\n\n\t\t\tif (hasFill || hasStroke && !dashLength || dontPaint) {\n\t\t\t\tdrawSegments(ctx, this, strokeMatrix);\n\t\t\t\tif (this._closed)\n\t\t\t\t\tctx.closePath();\n\t\t\t}\n\n\t\t\tfunction getOffset(i) {\n\t\t\t\treturn dashArray[((i % dashLength) + dashLength) % dashLength];\n\t\t\t}\n\n\t\t\tif (!dontPaint && (hasFill || hasStroke)) {\n\t\t\t\tthis._setStyles(ctx, param, viewMatrix);\n\t\t\t\tif (hasFill) {\n\t\t\t\t\tctx.fill(style.getFillRule());\n\t\t\t\t\tctx.shadowColor = 'rgba(0,0,0,0)';\n\t\t\t\t}\n\t\t\t\tif (hasStroke) {\n\t\t\t\t\tif (dashLength) {\n\t\t\t\t\t\tif (!dontStart)\n\t\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\tvar flattener = new PathFlattener(this, 0.25, 32, false,\n\t\t\t\t\t\t\t\tstrokeMatrix),\n\t\t\t\t\t\t\tlength = flattener.length,\n\t\t\t\t\t\t\tfrom = -style.getDashOffset(), to,\n\t\t\t\t\t\t\ti = 0;\n\t\t\t\t\t\twhile (from > 0) {\n\t\t\t\t\t\t\tfrom -= getOffset(i--) + getOffset(i--);\n\t\t\t\t\t\t}\n\t\t\t\t\t\twhile (from < length) {\n\t\t\t\t\t\t\tto = from + getOffset(i++);\n\t\t\t\t\t\t\tif (from > 0 || to > 0)\n\t\t\t\t\t\t\t\tflattener.drawPart(ctx,\n\t\t\t\t\t\t\t\t\t\tMath.max(from, 0), Math.max(to, 0));\n\t\t\t\t\t\t\tfrom = to + getOffset(i++);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tctx.stroke();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_drawSelected: function(ctx, matrix) {\n\t\t\tctx.beginPath();\n\t\t\tdrawSegments(ctx, this, matrix);\n\t\t\tctx.stroke();\n\t\t\tdrawHandles(ctx, this._segments, matrix, paper.settings.handleSize);\n\t\t}\n\t};\n},\nnew function() {\n\tfunction getCurrentSegment(that) {\n\t\tvar segments = that._segments;\n\t\tif (!segments.length)\n\t\t\tthrow new Error('Use a moveTo() command first');\n\t\treturn segments[segments.length - 1];\n\t}\n\n\treturn {\n\t\tmoveTo: function() {\n\t\t\tvar segments = this._segments;\n\t\t\tif (segments.length === 1)\n\t\t\t\tthis.removeSegment(0);\n\t\t\tif (!segments.length)\n\t\t\t\tthis._add([ new Segment(Point.read(arguments)) ]);\n\t\t},\n\n\t\tmoveBy: function() {\n\t\t\tthrow new Error('moveBy() is unsupported on Path items.');\n\t\t},\n\n\t\tlineTo: function() {\n\t\t\tthis._add([ new Segment(Point.read(arguments)) ]);\n\t\t},\n\n\t\tcubicCurveTo: function() {\n\t\t\tvar args = arguments,\n\t\t\t\thandle1 = Point.read(args),\n\t\t\t\thandle2 = Point.read(args),\n\t\t\t\tto = Point.read(args),\n\t\t\t\tcurrent = getCurrentSegment(this);\n\t\t\tcurrent.setHandleOut(handle1.subtract(current._point));\n\t\t\tthis._add([ new Segment(to, handle2.subtract(to)) ]);\n\t\t},\n\n\t\tquadraticCurveTo: function() {\n\t\t\tvar args = arguments,\n\t\t\t\thandle = Point.read(args),\n\t\t\t\tto = Point.read(args),\n\t\t\t\tcurrent = getCurrentSegment(this)._point;\n\t\t\tthis.cubicCurveTo(\n\t\t\t\thandle.add(current.subtract(handle).multiply(1 / 3)),\n\t\t\t\thandle.add(to.subtract(handle).multiply(1 / 3)),\n\t\t\t\tto\n\t\t\t);\n\t\t},\n\n\t\tcurveTo: function() {\n\t\t\tvar args = arguments,\n\t\t\t\tthrough = Point.read(args),\n\t\t\t\tto = Point.read(args),\n\t\t\t\tt = Base.pick(Base.read(args), 0.5),\n\t\t\t\tt1 = 1 - t,\n\t\t\t\tcurrent = getCurrentSegment(this)._point,\n\t\t\t\thandle = through.subtract(current.multiply(t1 * t1))\n\t\t\t\t\t.subtract(to.multiply(t * t)).divide(2 * t * t1);\n\t\t\tif (handle.isNaN())\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Cannot put a curve through points with parameter = ' + t);\n\t\t\tthis.quadraticCurveTo(handle, to);\n\t\t},\n\n\t\tarcTo: function() {\n\t\t\tvar args = arguments,\n\t\t\t\tabs = Math.abs,\n\t\t\t\tsqrt = Math.sqrt,\n\t\t\t\tcurrent = getCurrentSegment(this),\n\t\t\t\tfrom = current._point,\n\t\t\t\tto = Point.read(args),\n\t\t\t\tthrough,\n\t\t\t\tpeek = Base.peek(args),\n\t\t\t\tclockwise = Base.pick(peek, true),\n\t\t\t\tcenter, extent, vector, matrix;\n\t\t\tif (typeof clockwise === 'boolean') {\n\t\t\t\tvar middle = from.add(to).divide(2),\n\t\t\t\tthrough = middle.add(middle.subtract(from).rotate(\n\t\t\t\t\t\tclockwise ? -90 : 90));\n\t\t\t} else if (Base.remain(args) <= 2) {\n\t\t\t\tthrough = to;\n\t\t\t\tto = Point.read(args);\n\t\t\t} else if (!from.equals(to)) {\n\t\t\t\tvar radius = Size.read(args),\n\t\t\t\t\tisZero = Numerical.isZero;\n\t\t\t\tif (isZero(radius.width) || isZero(radius.height))\n\t\t\t\t\treturn this.lineTo(to);\n\t\t\t\tvar rotation = Base.read(args),\n\t\t\t\t\tclockwise = !!Base.read(args),\n\t\t\t\t\tlarge = !!Base.read(args),\n\t\t\t\t\tmiddle = from.add(to).divide(2),\n\t\t\t\t\tpt = from.subtract(middle).rotate(-rotation),\n\t\t\t\t\tx = pt.x,\n\t\t\t\t\ty = pt.y,\n\t\t\t\t\trx = abs(radius.width),\n\t\t\t\t\try = abs(radius.height),\n\t\t\t\t\trxSq = rx * rx,\n\t\t\t\t\trySq = ry * ry,\n\t\t\t\t\txSq = x * x,\n\t\t\t\t\tySq = y * y;\n\t\t\t\tvar factor = sqrt(xSq / rxSq + ySq / rySq);\n\t\t\t\tif (factor > 1) {\n\t\t\t\t\trx *= factor;\n\t\t\t\t\try *= factor;\n\t\t\t\t\trxSq = rx * rx;\n\t\t\t\t\trySq = ry * ry;\n\t\t\t\t}\n\t\t\t\tfactor = (rxSq * rySq - rxSq * ySq - rySq * xSq) /\n\t\t\t\t\t\t(rxSq * ySq + rySq * xSq);\n\t\t\t\tif (abs(factor) < 1e-12)\n\t\t\t\t\tfactor = 0;\n\t\t\t\tif (factor < 0)\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t'Cannot create an arc with the given arguments');\n\t\t\t\tcenter = new Point(rx * y / ry, -ry * x / rx)\n\t\t\t\t\t\t.multiply((large === clockwise ? -1 : 1) * sqrt(factor))\n\t\t\t\t\t\t.rotate(rotation).add(middle);\n\t\t\t\tmatrix = new Matrix().translate(center).rotate(rotation)\n\t\t\t\t\t\t.scale(rx, ry);\n\t\t\t\tvector = matrix._inverseTransform(from);\n\t\t\t\textent = vector.getDirectedAngle(matrix._inverseTransform(to));\n\t\t\t\tif (!clockwise && extent > 0)\n\t\t\t\t\textent -= 360;\n\t\t\t\telse if (clockwise && extent < 0)\n\t\t\t\t\textent += 360;\n\t\t\t}\n\t\t\tif (through) {\n\t\t\t\tvar l1 = new Line(from.add(through).divide(2),\n\t\t\t\t\t\t\tthrough.subtract(from).rotate(90), true),\n\t\t\t\t\tl2 = new Line(through.add(to).divide(2),\n\t\t\t\t\t\t\tto.subtract(through).rotate(90), true),\n\t\t\t\t\tline = new Line(from, to),\n\t\t\t\t\tthroughSide = line.getSide(through);\n\t\t\t\tcenter = l1.intersect(l2, true);\n\t\t\t\tif (!center) {\n\t\t\t\t\tif (!throughSide)\n\t\t\t\t\t\treturn this.lineTo(to);\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t'Cannot create an arc with the given arguments');\n\t\t\t\t}\n\t\t\t\tvector = from.subtract(center);\n\t\t\t\textent = vector.getDirectedAngle(to.subtract(center));\n\t\t\t\tvar centerSide = line.getSide(center, true);\n\t\t\t\tif (centerSide === 0) {\n\t\t\t\t\textent = throughSide * abs(extent);\n\t\t\t\t} else if (throughSide === centerSide) {\n\t\t\t\t\textent += extent < 0 ? 360 : -360;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (extent) {\n\t\t\t\tvar epsilon = 1e-5,\n\t\t\t\t\text = abs(extent),\n\t\t\t\t\tcount = ext >= 360\n\t\t\t\t\t\t? 4\n\t\t\t\t\t\t: Math.ceil((ext - epsilon) / 90),\n\t\t\t\t\tinc = extent / count,\n\t\t\t\t\thalf = inc * Math.PI / 360,\n\t\t\t\t\tz = 4 / 3 * Math.sin(half) / (1 + Math.cos(half)),\n\t\t\t\t\tsegments = [];\n\t\t\t\tfor (var i = 0; i <= count; i++) {\n\t\t\t\t\tvar pt = to,\n\t\t\t\t\t\tout = null;\n\t\t\t\t\tif (i < count) {\n\t\t\t\t\t\tout = vector.rotate(90).multiply(z);\n\t\t\t\t\t\tif (matrix) {\n\t\t\t\t\t\t\tpt = matrix._transformPoint(vector);\n\t\t\t\t\t\t\tout = matrix._transformPoint(vector.add(out))\n\t\t\t\t\t\t\t\t\t.subtract(pt);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpt = center.add(vector);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!i) {\n\t\t\t\t\t\tcurrent.setHandleOut(out);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar _in = vector.rotate(-90).multiply(z);\n\t\t\t\t\t\tif (matrix) {\n\t\t\t\t\t\t\t_in = matrix._transformPoint(vector.add(_in))\n\t\t\t\t\t\t\t\t\t.subtract(pt);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsegments.push(new Segment(pt, _in, out));\n\t\t\t\t\t}\n\t\t\t\t\tvector = vector.rotate(inc);\n\t\t\t\t}\n\t\t\t\tthis._add(segments);\n\t\t\t}\n\t\t},\n\n\t\tlineBy: function() {\n\t\t\tvar to = Point.read(arguments),\n\t\t\t\tcurrent = getCurrentSegment(this)._point;\n\t\t\tthis.lineTo(current.add(to));\n\t\t},\n\n\t\tcurveBy: function() {\n\t\t\tvar args = arguments,\n\t\t\t\tthrough = Point.read(args),\n\t\t\t\tto = Point.read(args),\n\t\t\t\tparameter = Base.read(args),\n\t\t\t\tcurrent = getCurrentSegment(this)._point;\n\t\t\tthis.curveTo(current.add(through), current.add(to), parameter);\n\t\t},\n\n\t\tcubicCurveBy: function() {\n\t\t\tvar args = arguments,\n\t\t\t\thandle1 = Point.read(args),\n\t\t\t\thandle2 = Point.read(args),\n\t\t\t\tto = Point.read(args),\n\t\t\t\tcurrent = getCurrentSegment(this)._point;\n\t\t\tthis.cubicCurveTo(current.add(handle1), current.add(handle2),\n\t\t\t\t\tcurrent.add(to));\n\t\t},\n\n\t\tquadraticCurveBy: function() {\n\t\t\tvar args = arguments,\n\t\t\t\thandle = Point.read(args),\n\t\t\t\tto = Point.read(args),\n\t\t\t\tcurrent = getCurrentSegment(this)._point;\n\t\t\tthis.quadraticCurveTo(current.add(handle), current.add(to));\n\t\t},\n\n\t\tarcBy: function() {\n\t\t\tvar args = arguments,\n\t\t\t\tcurrent = getCurrentSegment(this)._point,\n\t\t\t\tpoint = current.add(Point.read(args)),\n\t\t\t\tclockwise = Base.pick(Base.peek(args), true);\n\t\t\tif (typeof clockwise === 'boolean') {\n\t\t\t\tthis.arcTo(point, clockwise);\n\t\t\t} else {\n\t\t\t\tthis.arcTo(point, current.add(Point.read(args)));\n\t\t\t}\n\t\t},\n\n\t\tclosePath: function(tolerance) {\n\t\t\tthis.setClosed(true);\n\t\t\tthis.join(this, tolerance);\n\t\t}\n\t};\n}, {\n\n\t_getBounds: function(matrix, options) {\n\t\tvar method = options.handle\n\t\t\t\t? 'getHandleBounds'\n\t\t\t\t: options.stroke\n\t\t\t\t? 'getStrokeBounds'\n\t\t\t\t: 'getBounds';\n\t\treturn Path[method](this._segments, this._closed, this, matrix, options);\n\t},\n\nstatics: {\n\tgetBounds: function(segments, closed, path, matrix, options, strokePadding) {\n\t\tvar first = segments[0];\n\t\tif (!first)\n\t\t\treturn new Rectangle();\n\t\tvar coords = new Array(6),\n\t\t\tprevCoords = first._transformCoordinates(matrix, new Array(6)),\n\t\t\tmin = prevCoords.slice(0, 2),\n\t\t\tmax = min.slice(),\n\t\t\troots = new Array(2);\n\n\t\tfunction processSegment(segment) {\n\t\t\tsegment._transformCoordinates(matrix, coords);\n\t\t\tfor (var i = 0; i < 2; i++) {\n\t\t\t\tCurve._addBounds(\n\t\t\t\t\tprevCoords[i],\n\t\t\t\t\tprevCoords[i + 4],\n\t\t\t\t\tcoords[i + 2],\n\t\t\t\t\tcoords[i],\n\t\t\t\t\ti, strokePadding ? strokePadding[i] : 0, min, max, roots);\n\t\t\t}\n\t\t\tvar tmp = prevCoords;\n\t\t\tprevCoords = coords;\n\t\t\tcoords = tmp;\n\t\t}\n\n\t\tfor (var i = 1, l = segments.length; i < l; i++)\n\t\t\tprocessSegment(segments[i]);\n\t\tif (closed)\n\t\t\tprocessSegment(first);\n\t\treturn new Rectangle(min[0], min[1], max[0] - min[0], max[1] - min[1]);\n\t},\n\n\tgetStrokeBounds: function(segments, closed, path, matrix, options) {\n\t\tvar style = path.getStyle(),\n\t\t\tstroke = style.hasStroke(),\n\t\t\tstrokeWidth = style.getStrokeWidth(),\n\t\t\tstrokeMatrix = stroke && path._getStrokeMatrix(matrix, options),\n\t\t\tstrokePadding = stroke && Path._getStrokePadding(strokeWidth,\n\t\t\t\tstrokeMatrix),\n\t\t\tbounds = Path.getBounds(segments, closed, path, matrix, options,\n\t\t\t\tstrokePadding);\n\t\tif (!stroke)\n\t\t\treturn bounds;\n\t\tvar strokeRadius = strokeWidth / 2,\n\t\t\tjoin = style.getStrokeJoin(),\n\t\t\tcap = style.getStrokeCap(),\n\t\t\tmiterLimit = style.getMiterLimit(),\n\t\t\tjoinBounds = new Rectangle(new Size(strokePadding));\n\n\t\tfunction addPoint(point) {\n\t\t\tbounds = bounds.include(point);\n\t\t}\n\n\t\tfunction addRound(segment) {\n\t\t\tbounds = bounds.unite(\n\t\t\t\t\tjoinBounds.setCenter(segment._point.transform(matrix)));\n\t\t}\n\n\t\tfunction addJoin(segment, join) {\n\t\t\tif (join === 'round' || segment.isSmooth()) {\n\t\t\t\taddRound(segment);\n\t\t\t} else {\n\t\t\t\tPath._addBevelJoin(segment, join, strokeRadius, miterLimit,\n\t\t\t\t\t\tmatrix, strokeMatrix, addPoint);\n\t\t\t}\n\t\t}\n\n\t\tfunction addCap(segment, cap) {\n\t\t\tif (cap === 'round') {\n\t\t\t\taddRound(segment);\n\t\t\t} else {\n\t\t\t\tPath._addSquareCap(segment, cap, strokeRadius, matrix,\n\t\t\t\t\t\tstrokeMatrix, addPoint);\n\t\t\t}\n\t\t}\n\n\t\tvar length = segments.length - (closed ? 0 : 1);\n\t\tif (length > 0) {\n\t\t\tfor (var i = 1; i < length; i++) {\n\t\t\t\taddJoin(segments[i], join);\n\t\t\t}\n\t\t\tif (closed) {\n\t\t\t\taddJoin(segments[0], join);\n\t\t\t} else {\n\t\t\t\taddCap(segments[0], cap);\n\t\t\t\taddCap(segments[segments.length - 1], cap);\n\t\t\t}\n\t\t}\n\t\treturn bounds;\n\t},\n\n\t_getStrokePadding: function(radius, matrix) {\n\t\tif (!matrix)\n\t\t\treturn [radius, radius];\n\t\tvar hor = new Point(radius, 0).transform(matrix),\n\t\t\tver = new Point(0, radius).transform(matrix),\n\t\t\tphi = hor.getAngleInRadians(),\n\t\t\ta = hor.getLength(),\n\t\t\tb = ver.getLength();\n\t\tvar sin = Math.sin(phi),\n\t\t\tcos = Math.cos(phi),\n\t\t\ttan = Math.tan(phi),\n\t\t\ttx = Math.atan2(b * tan, a),\n\t\t\tty = Math.atan2(b, tan * a);\n\t\treturn [Math.abs(a * Math.cos(tx) * cos + b * Math.sin(tx) * sin),\n\t\t\t\tMath.abs(b * Math.sin(ty) * cos + a * Math.cos(ty) * sin)];\n\t},\n\n\t_addBevelJoin: function(segment, join, radius, miterLimit, matrix,\n\t\t\tstrokeMatrix, addPoint, isArea) {\n\t\tvar curve2 = segment.getCurve(),\n\t\t\tcurve1 = curve2.getPrevious(),\n\t\t\tpoint = curve2.getPoint1().transform(matrix),\n\t\t\tnormal1 = curve1.getNormalAtTime(1).multiply(radius)\n\t\t\t\t.transform(strokeMatrix),\n\t\t\tnormal2 = curve2.getNormalAtTime(0).multiply(radius)\n\t\t\t\t.transform(strokeMatrix),\n\t\t\t\tangle = normal1.getDirectedAngle(normal2);\n\t\tif (angle < 0 || angle >= 180) {\n\t\t\tnormal1 = normal1.negate();\n\t\t\tnormal2 = normal2.negate();\n\t\t}\n\t\tif (isArea)\n\t\t\taddPoint(point);\n\t\taddPoint(point.add(normal1));\n\t\tif (join === 'miter') {\n\t\t\tvar corner = new Line(point.add(normal1),\n\t\t\t\t\tnew Point(-normal1.y, normal1.x), true\n\t\t\t\t).intersect(new Line(point.add(normal2),\n\t\t\t\t\tnew Point(-normal2.y, normal2.x), true\n\t\t\t\t), true);\n\t\t\tif (corner && point.getDistance(corner) <= miterLimit * radius) {\n\t\t\t\taddPoint(corner);\n\t\t\t}\n\t\t}\n\t\taddPoint(point.add(normal2));\n\t},\n\n\t_addSquareCap: function(segment, cap, radius, matrix, strokeMatrix,\n\t\t\taddPoint, isArea) {\n\t\tvar point = segment._point.transform(matrix),\n\t\t\tloc = segment.getLocation(),\n\t\t\tnormal = loc.getNormal()\n\t\t\t\t\t.multiply(loc.getTime() === 0 ? radius : -radius)\n\t\t\t\t\t.transform(strokeMatrix);\n\t\tif (cap === 'square') {\n\t\t\tif (isArea) {\n\t\t\t\taddPoint(point.subtract(normal));\n\t\t\t\taddPoint(point.add(normal));\n\t\t\t}\n\t\t\tpoint = point.add(normal.rotate(-90));\n\t\t}\n\t\taddPoint(point.add(normal));\n\t\taddPoint(point.subtract(normal));\n\t},\n\n\tgetHandleBounds: function(segments, closed, path, matrix, options) {\n\t\tvar style = path.getStyle(),\n\t\t\tstroke = options.stroke && style.hasStroke(),\n\t\t\tstrokePadding,\n\t\t\tjoinPadding;\n\t\tif (stroke) {\n\t\t\tvar strokeMatrix = path._getStrokeMatrix(matrix, options),\n\t\t\t\tstrokeRadius = style.getStrokeWidth() / 2,\n\t\t\t\tjoinRadius = strokeRadius;\n\t\t\tif (style.getStrokeJoin() === 'miter')\n\t\t\t\tjoinRadius = strokeRadius * style.getMiterLimit();\n\t\t\tif (style.getStrokeCap() === 'square')\n\t\t\t\tjoinRadius = Math.max(joinRadius, strokeRadius * Math.SQRT2);\n\t\t\tstrokePadding = Path._getStrokePadding(strokeRadius, strokeMatrix);\n\t\t\tjoinPadding = Path._getStrokePadding(joinRadius, strokeMatrix);\n\t\t}\n\t\tvar coords = new Array(6),\n\t\t\tx1 = Infinity,\n\t\t\tx2 = -x1,\n\t\t\ty1 = x1,\n\t\t\ty2 = x2;\n\t\tfor (var i = 0, l = segments.length; i < l; i++) {\n\t\t\tvar segment = segments[i];\n\t\t\tsegment._transformCoordinates(matrix, coords);\n\t\t\tfor (var j = 0; j < 6; j += 2) {\n\t\t\t\tvar padding = !j ? joinPadding : strokePadding,\n\t\t\t\t\tpaddingX = padding ? padding[0] : 0,\n\t\t\t\t\tpaddingY = padding ? padding[1] : 0,\n\t\t\t\t\tx = coords[j],\n\t\t\t\t\ty = coords[j + 1],\n\t\t\t\t\txn = x - paddingX,\n\t\t\t\t\txx = x + paddingX,\n\t\t\t\t\tyn = y - paddingY,\n\t\t\t\t\tyx = y + paddingY;\n\t\t\t\tif (xn < x1) x1 = xn;\n\t\t\t\tif (xx > x2) x2 = xx;\n\t\t\t\tif (yn < y1) y1 = yn;\n\t\t\t\tif (yx > y2) y2 = yx;\n\t\t\t}\n\t\t}\n\t\treturn new Rectangle(x1, y1, x2 - x1, y2 - y1);\n\t}\n}});\n\nPath.inject({ statics: new function() {\n\n\tvar kappa = 0.5522847498307936,\n\t\tellipseSegments = [\n\t\t\tnew Segment([-1, 0], [0, kappa ], [0, -kappa]),\n\t\t\tnew Segment([0, -1], [-kappa, 0], [kappa, 0 ]),\n\t\t\tnew Segment([1, 0], [0, -kappa], [0, kappa ]),\n\t\t\tnew Segment([0, 1], [kappa, 0 ], [-kappa, 0])\n\t\t];\n\n\tfunction createPath(segments, closed, args) {\n\t\tvar props = Base.getNamed(args),\n\t\t\tpath = new Path(props && (\n\t\t\t\tprops.insert == true ? Item.INSERT\n\t\t\t\t: props.insert == false ? Item.NO_INSERT\n\t\t\t\t: null\n\t\t\t));\n\t\tpath._add(segments);\n\t\tpath._closed = closed;\n\t\treturn path.set(props, Item.INSERT);\n\t}\n\n\tfunction createEllipse(center, radius, args) {\n\t\tvar segments = new Array(4);\n\t\tfor (var i = 0; i < 4; i++) {\n\t\t\tvar segment = ellipseSegments[i];\n\t\t\tsegments[i] = new Segment(\n\t\t\t\tsegment._point.multiply(radius).add(center),\n\t\t\t\tsegment._handleIn.multiply(radius),\n\t\t\t\tsegment._handleOut.multiply(radius)\n\t\t\t);\n\t\t}\n\t\treturn createPath(segments, true, args);\n\t}\n\n\treturn {\n\t\tLine: function() {\n\t\t\tvar args = arguments;\n\t\t\treturn createPath([\n\t\t\t\tnew Segment(Point.readNamed(args, 'from')),\n\t\t\t\tnew Segment(Point.readNamed(args, 'to'))\n\t\t\t], false, args);\n\t\t},\n\n\t\tCircle: function() {\n\t\t\tvar args = arguments,\n\t\t\t\tcenter = Point.readNamed(args, 'center'),\n\t\t\t\tradius = Base.readNamed(args, 'radius');\n\t\t\treturn createEllipse(center, new Size(radius), args);\n\t\t},\n\n\t\tRectangle: function() {\n\t\t\tvar args = arguments,\n\t\t\t\trect = Rectangle.readNamed(args, 'rectangle'),\n\t\t\t\tradius = Size.readNamed(args, 'radius', 0,\n\t\t\t\t\t\t{ readNull: true }),\n\t\t\t\tbl = rect.getBottomLeft(true),\n\t\t\t\ttl = rect.getTopLeft(true),\n\t\t\t\ttr = rect.getTopRight(true),\n\t\t\t\tbr = rect.getBottomRight(true),\n\t\t\t\tsegments;\n\t\t\tif (!radius || radius.isZero()) {\n\t\t\t\tsegments = [\n\t\t\t\t\tnew Segment(bl),\n\t\t\t\t\tnew Segment(tl),\n\t\t\t\t\tnew Segment(tr),\n\t\t\t\t\tnew Segment(br)\n\t\t\t\t];\n\t\t\t} else {\n\t\t\t\tradius = Size.min(radius, rect.getSize(true).divide(2));\n\t\t\t\tvar rx = radius.width,\n\t\t\t\t\try = radius.height,\n\t\t\t\t\thx = rx * kappa,\n\t\t\t\t\thy = ry * kappa;\n\t\t\t\tsegments = [\n\t\t\t\t\tnew Segment(bl.add(rx, 0), null, [-hx, 0]),\n\t\t\t\t\tnew Segment(bl.subtract(0, ry), [0, hy]),\n\t\t\t\t\tnew Segment(tl.add(0, ry), null, [0, -hy]),\n\t\t\t\t\tnew Segment(tl.add(rx, 0), [-hx, 0], null),\n\t\t\t\t\tnew Segment(tr.subtract(rx, 0), null, [hx, 0]),\n\t\t\t\t\tnew Segment(tr.add(0, ry), [0, -hy], null),\n\t\t\t\t\tnew Segment(br.subtract(0, ry), null, [0, hy]),\n\t\t\t\t\tnew Segment(br.subtract(rx, 0), [hx, 0])\n\t\t\t\t];\n\t\t\t}\n\t\t\treturn createPath(segments, true, args);\n\t\t},\n\n\t\tRoundRectangle: '#Rectangle',\n\n\t\tEllipse: function() {\n\t\t\tvar args = arguments,\n\t\t\t\tellipse = Shape._readEllipse(args);\n\t\t\treturn createEllipse(ellipse.center, ellipse.radius, args);\n\t\t},\n\n\t\tOval: '#Ellipse',\n\n\t\tArc: function() {\n\t\t\tvar args = arguments,\n\t\t\t\tfrom = Point.readNamed(args, 'from'),\n\t\t\t\tthrough = Point.readNamed(args, 'through'),\n\t\t\t\tto = Point.readNamed(args, 'to'),\n\t\t\t\tprops = Base.getNamed(args),\n\t\t\t\tpath = new Path(props && props.insert == false\n\t\t\t\t\t\t&& Item.NO_INSERT);\n\t\t\tpath.moveTo(from);\n\t\t\tpath.arcTo(through, to);\n\t\t\treturn path.set(props);\n\t\t},\n\n\t\tRegularPolygon: function() {\n\t\t\tvar args = arguments,\n\t\t\t\tcenter = Point.readNamed(args, 'center'),\n\t\t\t\tsides = Base.readNamed(args, 'sides'),\n\t\t\t\tradius = Base.readNamed(args, 'radius'),\n\t\t\t\tstep = 360 / sides,\n\t\t\t\tthree = sides % 3 === 0,\n\t\t\t\tvector = new Point(0, three ? -radius : radius),\n\t\t\t\toffset = three ? -1 : 0.5,\n\t\t\t\tsegments = new Array(sides);\n\t\t\tfor (var i = 0; i < sides; i++)\n\t\t\t\tsegments[i] = new Segment(center.add(\n\t\t\t\t\tvector.rotate((i + offset) * step)));\n\t\t\treturn createPath(segments, true, args);\n\t\t},\n\n\t\tStar: function() {\n\t\t\tvar args = arguments,\n\t\t\t\tcenter = Point.readNamed(args, 'center'),\n\t\t\t\tpoints = Base.readNamed(args, 'points') * 2,\n\t\t\t\tradius1 = Base.readNamed(args, 'radius1'),\n\t\t\t\tradius2 = Base.readNamed(args, 'radius2'),\n\t\t\t\tstep = 360 / points,\n\t\t\t\tvector = new Point(0, -1),\n\t\t\t\tsegments = new Array(points);\n\t\t\tfor (var i = 0; i < points; i++)\n\t\t\t\tsegments[i] = new Segment(center.add(vector.rotate(step * i)\n\t\t\t\t\t\t.multiply(i % 2 ? radius2 : radius1)));\n\t\t\treturn createPath(segments, true, args);\n\t\t}\n\t};\n}});\n\nvar CompoundPath = PathItem.extend({\n\t_class: 'CompoundPath',\n\t_serializeFields: {\n\t\tchildren: []\n\t},\n\tbeans: true,\n\n\tinitialize: function CompoundPath(arg) {\n\t\tthis._children = [];\n\t\tthis._namedChildren = {};\n\t\tif (!this._initialize(arg)) {\n\t\t\tif (typeof arg === 'string') {\n\t\t\t\tthis.setPathData(arg);\n\t\t\t} else {\n\t\t\t\tthis.addChildren(Array.isArray(arg) ? arg : arguments);\n\t\t\t}\n\t\t}\n\t},\n\n\tinsertChildren: function insertChildren(index, items) {\n\t\tvar list = items,\n\t\t\tfirst = list[0];\n\t\tif (first && typeof first[0] === 'number')\n\t\t\tlist = [list];\n\t\tfor (var i = items.length - 1; i >= 0; i--) {\n\t\t\tvar item = list[i];\n\t\t\tif (list === items && !(item instanceof Path))\n\t\t\t\tlist = Base.slice(list);\n\t\t\tif (Array.isArray(item)) {\n\t\t\t\tlist[i] = new Path({ segments: item, insert: false });\n\t\t\t} else if (item instanceof CompoundPath) {\n\t\t\t\tlist.splice.apply(list, [i, 1].concat(item.removeChildren()));\n\t\t\t\titem.remove();\n\t\t\t}\n\t\t}\n\t\treturn insertChildren.base.call(this, index, list);\n\t},\n\n\treduce: function reduce(options) {\n\t\tvar children = this._children;\n\t\tfor (var i = children.length - 1; i >= 0; i--) {\n\t\t\tvar path = children[i].reduce(options);\n\t\t\tif (path.isEmpty())\n\t\t\t\tpath.remove();\n\t\t}\n\t\tif (!children.length) {\n\t\t\tvar path = new Path(Item.NO_INSERT);\n\t\t\tpath.copyAttributes(this);\n\t\t\tpath.insertAbove(this);\n\t\t\tthis.remove();\n\t\t\treturn path;\n\t\t}\n\t\treturn reduce.base.call(this);\n\t},\n\n\tisClosed: function() {\n\t\tvar children = this._children;\n\t\tfor (var i = 0, l = children.length; i < l; i++) {\n\t\t\tif (!children[i]._closed)\n\t\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\tsetClosed: function(closed) {\n\t\tvar children = this._children;\n\t\tfor (var i = 0, l = children.length; i < l; i++) {\n\t\t\tchildren[i].setClosed(closed);\n\t\t}\n\t},\n\n\tgetFirstSegment: function() {\n\t\tvar first = this.getFirstChild();\n\t\treturn first && first.getFirstSegment();\n\t},\n\n\tgetLastSegment: function() {\n\t\tvar last = this.getLastChild();\n\t\treturn last && last.getLastSegment();\n\t},\n\n\tgetCurves: function() {\n\t\tvar children = this._children,\n\t\t\tcurves = [];\n\t\tfor (var i = 0, l = children.length; i < l; i++) {\n\t\t\tBase.push(curves, children[i].getCurves());\n\t\t}\n\t\treturn curves;\n\t},\n\n\tgetFirstCurve: function() {\n\t\tvar first = this.getFirstChild();\n\t\treturn first && first.getFirstCurve();\n\t},\n\n\tgetLastCurve: function() {\n\t\tvar last = this.getLastChild();\n\t\treturn last && last.getLastCurve();\n\t},\n\n\tgetArea: function() {\n\t\tvar children = this._children,\n\t\t\tarea = 0;\n\t\tfor (var i = 0, l = children.length; i < l; i++)\n\t\t\tarea += children[i].getArea();\n\t\treturn area;\n\t},\n\n\tgetLength: function() {\n\t\tvar children = this._children,\n\t\t\tlength = 0;\n\t\tfor (var i = 0, l = children.length; i < l; i++)\n\t\t\tlength += children[i].getLength();\n\t\treturn length;\n\t},\n\n\tgetPathData: function(_matrix, _precision) {\n\t\tvar children = this._children,\n\t\t\tpaths = [];\n\t\tfor (var i = 0, l = children.length; i < l; i++) {\n\t\t\tvar child = children[i],\n\t\t\t\tmx = child._matrix;\n\t\t\tpaths.push(child.getPathData(_matrix && !mx.isIdentity()\n\t\t\t\t\t? _matrix.appended(mx) : _matrix, _precision));\n\t\t}\n\t\treturn paths.join('');\n\t},\n\n\t_hitTestChildren: function _hitTestChildren(point, options, viewMatrix) {\n\t\treturn _hitTestChildren.base.call(this, point,\n\t\t\t\toptions.class === Path || options.type === 'path' ? options\n\t\t\t\t\t: Base.set({}, options, { fill: false }),\n\t\t\t\tviewMatrix);\n\t},\n\n\t_draw: function(ctx, param, viewMatrix, strokeMatrix) {\n\t\tvar children = this._children;\n\t\tif (!children.length)\n\t\t\treturn;\n\n\t\tparam = param.extend({ dontStart: true, dontFinish: true });\n\t\tctx.beginPath();\n\t\tfor (var i = 0, l = children.length; i < l; i++)\n\t\t\tchildren[i].draw(ctx, param, strokeMatrix);\n\n\t\tif (!param.clip) {\n\t\t\tthis._setStyles(ctx, param, viewMatrix);\n\t\t\tvar style = this._style;\n\t\t\tif (style.hasFill()) {\n\t\t\t\tctx.fill(style.getFillRule());\n\t\t\t\tctx.shadowColor = 'rgba(0,0,0,0)';\n\t\t\t}\n\t\t\tif (style.hasStroke())\n\t\t\t\tctx.stroke();\n\t\t}\n\t},\n\n\t_drawSelected: function(ctx, matrix, selectionItems) {\n\t\tvar children = this._children;\n\t\tfor (var i = 0, l = children.length; i < l; i++) {\n\t\t\tvar child = children[i],\n\t\t\t\tmx = child._matrix;\n\t\t\tif (!selectionItems[child._id]) {\n\t\t\t\tchild._drawSelected(ctx, mx.isIdentity() ? matrix\n\t\t\t\t\t\t: matrix.appended(mx));\n\t\t\t}\n\t\t}\n\t}\n},\nnew function() {\n\tfunction getCurrentPath(that, check) {\n\t\tvar children = that._children;\n\t\tif (check && !children.length)\n\t\t\tthrow new Error('Use a moveTo() command first');\n\t\treturn children[children.length - 1];\n\t}\n\n\treturn Base.each(['lineTo', 'cubicCurveTo', 'quadraticCurveTo', 'curveTo',\n\t\t\t'arcTo', 'lineBy', 'cubicCurveBy', 'quadraticCurveBy', 'curveBy',\n\t\t\t'arcBy'],\n\t\tfunction(key) {\n\t\t\tthis[key] = function() {\n\t\t\t\tvar path = getCurrentPath(this, true);\n\t\t\t\tpath[key].apply(path, arguments);\n\t\t\t};\n\t\t}, {\n\t\t\tmoveTo: function() {\n\t\t\t\tvar current = getCurrentPath(this),\n\t\t\t\t\tpath = current && current.isEmpty() ? current\n\t\t\t\t\t\t\t: new Path(Item.NO_INSERT);\n\t\t\t\tif (path !== current)\n\t\t\t\t\tthis.addChild(path);\n\t\t\t\tpath.moveTo.apply(path, arguments);\n\t\t\t},\n\n\t\t\tmoveBy: function() {\n\t\t\t\tvar current = getCurrentPath(this, true),\n\t\t\t\t\tlast = current && current.getLastSegment(),\n\t\t\t\t\tpoint = Point.read(arguments);\n\t\t\t\tthis.moveTo(last ? point.add(last._point) : point);\n\t\t\t},\n\n\t\t\tclosePath: function(tolerance) {\n\t\t\t\tgetCurrentPath(this, true).closePath(tolerance);\n\t\t\t}\n\t\t}\n\t);\n}, Base.each(['reverse', 'flatten', 'simplify', 'smooth'], function(key) {\n\tthis[key] = function(param) {\n\t\tvar children = this._children,\n\t\t\tres;\n\t\tfor (var i = 0, l = children.length; i < l; i++) {\n\t\t\tres = children[i][key](param) || res;\n\t\t}\n\t\treturn res;\n\t};\n}, {}));\n\nPathItem.inject(new function() {\n\tvar min = Math.min,\n\t\tmax = Math.max,\n\t\tabs = Math.abs,\n\t\toperators = {\n\t\t\tunite: { '1': true, '2': true },\n\t\t\tintersect: { '2': true },\n\t\t\tsubtract: { '1': true },\n\t\t\texclude: { '1': true, '-1': true }\n\t\t};\n\n\tfunction getPaths(path) {\n\t\treturn path._children || [path];\n\t}\n\n\tfunction preparePath(path, resolve) {\n\t\tvar res = path\n\t\t\t.clone(false)\n\t\t\t.reduce({ simplify: true })\n\t\t\t.transform(null, true, true);\n\t\tif (resolve) {\n\t\t\tvar paths = getPaths(res);\n\t\t\tfor (var i = 0, l = paths.length; i < l; i++) {\n\t\t\t\tvar path = paths[i];\n\t\t\t\tif (!path._closed && !path.isEmpty()) {\n\t\t\t\t\tpath.closePath(1e-12);\n\t\t\t\t\tpath.getFirstSegment().setHandleIn(0, 0);\n\t\t\t\t\tpath.getLastSegment().setHandleOut(0, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t\tres = res\n\t\t\t\t.resolveCrossings()\n\t\t\t\t.reorient(res.getFillRule() === 'nonzero', true);\n\t\t}\n\t\treturn res;\n\t}\n\n\tfunction createResult(paths, simplify, path1, path2, options) {\n\t\tvar result = new CompoundPath(Item.NO_INSERT);\n\t\tresult.addChildren(paths, true);\n\t\tresult = result.reduce({ simplify: simplify });\n\t\tif (!(options && options.insert == false)) {\n\t\t\tresult.insertAbove(path2 && path1.isSibling(path2)\n\t\t\t\t\t&& path1.getIndex() < path2.getIndex() ? path2 : path1);\n\t\t}\n\t\tresult.copyAttributes(path1, true);\n\t\treturn result;\n\t}\n\n\tfunction filterIntersection(inter) {\n\t\treturn inter.hasOverlap() || inter.isCrossing();\n\t}\n\n\tfunction traceBoolean(path1, path2, operation, options) {\n\t\tif (options && (options.trace == false || options.stroke) &&\n\t\t\t\t/^(subtract|intersect)$/.test(operation))\n\t\t\treturn splitBoolean(path1, path2, operation);\n\t\tvar _path1 = preparePath(path1, true),\n\t\t\t_path2 = path2 && path1 !== path2 && preparePath(path2, true),\n\t\t\toperator = operators[operation];\n\t\toperator[operation] = true;\n\t\tif (_path2 && (operator.subtract || operator.exclude)\n\t\t\t\t^ (_path2.isClockwise() ^ _path1.isClockwise()))\n\t\t\t_path2.reverse();\n\t\tvar crossings = divideLocations(CurveLocation.expand(\n\t\t\t\t_path1.getIntersections(_path2, filterIntersection))),\n\t\t\tpaths1 = getPaths(_path1),\n\t\t\tpaths2 = _path2 && getPaths(_path2),\n\t\t\tsegments = [],\n\t\t\tcurves = [],\n\t\t\tpaths;\n\n\t\tfunction collectPaths(paths) {\n\t\t\tfor (var i = 0, l = paths.length; i < l; i++) {\n\t\t\t\tvar path = paths[i];\n\t\t\t\tBase.push(segments, path._segments);\n\t\t\t\tBase.push(curves, path.getCurves());\n\t\t\t\tpath._overlapsOnly = true;\n\t\t\t}\n\t\t}\n\n\t\tfunction getCurves(indices) {\n\t\t\tvar list = [];\n\t\t\tfor (var i = 0, l = indices && indices.length; i < l; i++) {\n\t\t\t\tlist.push(curves[indices[i]]);\n\t\t\t}\n\t\t\treturn list;\n\t\t}\n\n\t\tif (crossings.length) {\n\t\t\tcollectPaths(paths1);\n\t\t\tif (paths2)\n\t\t\t\tcollectPaths(paths2);\n\n\t\t\tvar curvesValues = new Array(curves.length);\n\t\t\tfor (var i = 0, l = curves.length; i < l; i++) {\n\t\t\t\tcurvesValues[i] = curves[i].getValues();\n\t\t\t}\n\t\t\tvar curveCollisions = CollisionDetection.findCurveBoundsCollisions(\n\t\t\t\t\tcurvesValues, curvesValues, 0, true);\n\t\t\tvar curveCollisionsMap = {};\n\t\t\tfor (var i = 0; i < curves.length; i++) {\n\t\t\t\tvar curve = curves[i],\n\t\t\t\t\tid = curve._path._id,\n\t\t\t\t\tmap = curveCollisionsMap[id] = curveCollisionsMap[id] || {};\n\t\t\t\tmap[curve.getIndex()] = {\n\t\t\t\t\thor: getCurves(curveCollisions[i].hor),\n\t\t\t\t\tver: getCurves(curveCollisions[i].ver)\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfor (var i = 0, l = crossings.length; i < l; i++) {\n\t\t\t\tpropagateWinding(crossings[i]._segment, _path1, _path2,\n\t\t\t\t\t\tcurveCollisionsMap, operator);\n\t\t\t}\n\t\t\tfor (var i = 0, l = segments.length; i < l; i++) {\n\t\t\t\tvar segment = segments[i],\n\t\t\t\t\tinter = segment._intersection;\n\t\t\t\tif (!segment._winding) {\n\t\t\t\t\tpropagateWinding(segment, _path1, _path2,\n\t\t\t\t\t\t\tcurveCollisionsMap, operator);\n\t\t\t\t}\n\t\t\t\tif (!(inter && inter._overlap))\n\t\t\t\t\tsegment._path._overlapsOnly = false;\n\t\t\t}\n\t\t\tpaths = tracePaths(segments, operator);\n\t\t} else {\n\t\t\tpaths = reorientPaths(\n\t\t\t\t\tpaths2 ? paths1.concat(paths2) : paths1.slice(),\n\t\t\t\t\tfunction(w) {\n\t\t\t\t\t\treturn !!operator[w];\n\t\t\t\t\t});\n\t\t}\n\t\treturn createResult(paths, true, path1, path2, options);\n\t}\n\n\tfunction splitBoolean(path1, path2, operation) {\n\t\tvar _path1 = preparePath(path1),\n\t\t\t_path2 = preparePath(path2),\n\t\t\tcrossings = _path1.getIntersections(_path2, filterIntersection),\n\t\t\tsubtract = operation === 'subtract',\n\t\t\tdivide = operation === 'divide',\n\t\t\tadded = {},\n\t\t\tpaths = [];\n\n\t\tfunction addPath(path) {\n\t\t\tif (!added[path._id] && (divide ||\n\t\t\t\t\t_path2.contains(path.getPointAt(path.getLength() / 2))\n\t\t\t\t\t\t^ subtract)) {\n\t\t\t\tpaths.unshift(path);\n\t\t\t\treturn added[path._id] = true;\n\t\t\t}\n\t\t}\n\n\t\tfor (var i = crossings.length - 1; i >= 0; i--) {\n\t\t\tvar path = crossings[i].split();\n\t\t\tif (path) {\n\t\t\t\tif (addPath(path))\n\t\t\t\t\tpath.getFirstSegment().setHandleIn(0, 0);\n\t\t\t\t_path1.getLastSegment().setHandleOut(0, 0);\n\t\t\t}\n\t\t}\n\t\taddPath(_path1);\n\t\treturn createResult(paths, false, path1, path2);\n\t}\n\n\tfunction linkIntersections(from, to) {\n\t\tvar prev = from;\n\t\twhile (prev) {\n\t\t\tif (prev === to)\n\t\t\t\treturn;\n\t\t\tprev = prev._previous;\n\t\t}\n\t\twhile (from._next && from._next !== to)\n\t\t\tfrom = from._next;\n\t\tif (!from._next) {\n\t\t\twhile (to._previous)\n\t\t\t\tto = to._previous;\n\t\t\tfrom._next = to;\n\t\t\tto._previous = from;\n\t\t}\n\t}\n\n\tfunction clearCurveHandles(curves) {\n\t\tfor (var i = curves.length - 1; i >= 0; i--)\n\t\t\tcurves[i].clearHandles();\n\t}\n\n\tfunction reorientPaths(paths, isInside, clockwise) {\n\t\tvar length = paths && paths.length;\n\t\tif (length) {\n\t\t\tvar lookup = Base.each(paths, function (path, i) {\n\t\t\t\t\tthis[path._id] = {\n\t\t\t\t\t\tcontainer: null,\n\t\t\t\t\t\twinding: path.isClockwise() ? 1 : -1,\n\t\t\t\t\t\tindex: i\n\t\t\t\t\t};\n\t\t\t\t}, {}),\n\t\t\t\tsorted = paths.slice().sort(function (a, b) {\n\t\t\t\t\treturn abs(b.getArea()) - abs(a.getArea());\n\t\t\t\t}),\n\t\t\t\tfirst = sorted[0];\n\t\t\tvar collisions = CollisionDetection.findItemBoundsCollisions(sorted,\n\t\t\t\t\tnull, Numerical.GEOMETRIC_EPSILON);\n\t\t\tif (clockwise == null)\n\t\t\t\tclockwise = first.isClockwise();\n\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\tvar path1 = sorted[i],\n\t\t\t\t\tentry1 = lookup[path1._id],\n\t\t\t\t\tcontainerWinding = 0,\n\t\t\t\t\tindices = collisions[i];\n\t\t\t\tif (indices) {\n\t\t\t\t\tvar point = null;\n\t\t\t\t\tfor (var j = indices.length - 1; j >= 0; j--) {\n\t\t\t\t\t\tif (indices[j] < i) {\n\t\t\t\t\t\t\tpoint = point || path1.getInteriorPoint();\n\t\t\t\t\t\t\tvar path2 = sorted[indices[j]];\n\t\t\t\t\t\t\tif (path2.contains(point)) {\n\t\t\t\t\t\t\t\tvar entry2 = lookup[path2._id];\n\t\t\t\t\t\t\t\tcontainerWinding = entry2.winding;\n\t\t\t\t\t\t\t\tentry1.winding += containerWinding;\n\t\t\t\t\t\t\t\tentry1.container = entry2.exclude\n\t\t\t\t\t\t\t\t\t? entry2.container : path2;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isInside(entry1.winding) === isInside(containerWinding)) {\n\t\t\t\t\tentry1.exclude = true;\n\t\t\t\t\tpaths[entry1.index] = null;\n\t\t\t\t} else {\n\t\t\t\t\tvar container = entry1.container;\n\t\t\t\t\tpath1.setClockwise(\n\t\t\t\t\t\t\tcontainer ? !container.isClockwise() : clockwise);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn paths;\n\t}\n\n\tfunction divideLocations(locations, include, clearLater) {\n\t\tvar results = include && [],\n\t\t\ttMin = 1e-8,\n\t\t\ttMax = 1 - tMin,\n\t\t\tclearHandles = false,\n\t\t\tclearCurves = clearLater || [],\n\t\t\tclearLookup = clearLater && {},\n\t\t\trenormalizeLocs,\n\t\t\tprevCurve,\n\t\t\tprevTime;\n\n\t\tfunction getId(curve) {\n\t\t\treturn curve._path._id + '.' + curve._segment1._index;\n\t\t}\n\n\t\tfor (var i = (clearLater && clearLater.length) - 1; i >= 0; i--) {\n\t\t\tvar curve = clearLater[i];\n\t\t\tif (curve._path)\n\t\t\t\tclearLookup[getId(curve)] = true;\n\t\t}\n\n\t\tfor (var i = locations.length - 1; i >= 0; i--) {\n\t\t\tvar loc = locations[i],\n\t\t\t\ttime = loc._time,\n\t\t\t\torigTime = time,\n\t\t\t\texclude = include && !include(loc),\n\t\t\t\tcurve = loc._curve,\n\t\t\t\tsegment;\n\t\t\tif (curve) {\n\t\t\t\tif (curve !== prevCurve) {\n\t\t\t\t\tclearHandles = !curve.hasHandles()\n\t\t\t\t\t\t\t|| clearLookup && clearLookup[getId(curve)];\n\t\t\t\t\trenormalizeLocs = [];\n\t\t\t\t\tprevTime = null;\n\t\t\t\t\tprevCurve = curve;\n\t\t\t\t} else if (prevTime >= tMin) {\n\t\t\t\t\ttime /= prevTime;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (exclude) {\n\t\t\t\tif (renormalizeLocs)\n\t\t\t\t\trenormalizeLocs.push(loc);\n\t\t\t\tcontinue;\n\t\t\t} else if (include) {\n\t\t\t\tresults.unshift(loc);\n\t\t\t}\n\t\t\tprevTime = origTime;\n\t\t\tif (time < tMin) {\n\t\t\t\tsegment = curve._segment1;\n\t\t\t} else if (time > tMax) {\n\t\t\t\tsegment = curve._segment2;\n\t\t\t} else {\n\t\t\t\tvar newCurve = curve.divideAtTime(time, true);\n\t\t\t\tif (clearHandles)\n\t\t\t\t\tclearCurves.push(curve, newCurve);\n\t\t\t\tsegment = newCurve._segment1;\n\t\t\t\tfor (var j = renormalizeLocs.length - 1; j >= 0; j--) {\n\t\t\t\t\tvar l = renormalizeLocs[j];\n\t\t\t\t\tl._time = (l._time - time) / (1 - time);\n\t\t\t\t}\n\t\t\t}\n\t\t\tloc._setSegment(segment);\n\t\t\tvar inter = segment._intersection,\n\t\t\t\tdest = loc._intersection;\n\t\t\tif (inter) {\n\t\t\t\tlinkIntersections(inter, dest);\n\t\t\t\tvar other = inter;\n\t\t\t\twhile (other) {\n\t\t\t\t\tlinkIntersections(other._intersection, inter);\n\t\t\t\t\tother = other._next;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsegment._intersection = dest;\n\t\t\t}\n\t\t}\n\t\tif (!clearLater)\n\t\t\tclearCurveHandles(clearCurves);\n\t\treturn results || locations;\n\t}\n\n\tfunction getWinding(point, curves, dir, closed, dontFlip) {\n\t\tvar curvesList = Array.isArray(curves)\n\t\t\t? curves\n\t\t\t: curves[dir ? 'hor' : 'ver'];\n\t\tvar ia = dir ? 1 : 0,\n\t\t\tio = ia ^ 1,\n\t\t\tpv = [point.x, point.y],\n\t\t\tpa = pv[ia],\n\t\t\tpo = pv[io],\n\t\t\twindingEpsilon = 1e-9,\n\t\t\tqualityEpsilon = 1e-6,\n\t\t\tpaL = pa - windingEpsilon,\n\t\t\tpaR = pa + windingEpsilon,\n\t\t\twindingL = 0,\n\t\t\twindingR = 0,\n\t\t\tpathWindingL = 0,\n\t\t\tpathWindingR = 0,\n\t\t\tonPath = false,\n\t\t\tonAnyPath = false,\n\t\t\tquality = 1,\n\t\t\troots = [],\n\t\t\tvPrev,\n\t\t\tvClose;\n\n\t\tfunction addWinding(v) {\n\t\t\tvar o0 = v[io + 0],\n\t\t\t\to3 = v[io + 6];\n\t\t\tif (po < min(o0, o3) || po > max(o0, o3)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar a0 = v[ia + 0],\n\t\t\t\ta1 = v[ia + 2],\n\t\t\t\ta2 = v[ia + 4],\n\t\t\t\ta3 = v[ia + 6];\n\t\t\tif (o0 === o3) {\n\t\t\t\tif (a0 < paR && a3 > paL || a3 < paR && a0 > paL) {\n\t\t\t\t\tonPath = true;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar t = po === o0 ? 0\n\t\t\t\t\t: po === o3 ? 1\n\t\t\t\t\t: paL > max(a0, a1, a2, a3) || paR < min(a0, a1, a2, a3)\n\t\t\t\t\t? 1\n\t\t\t\t\t: Curve.solveCubic(v, io, po, roots, 0, 1) > 0\n\t\t\t\t\t\t? roots[0]\n\t\t\t\t\t\t: 1,\n\t\t\t\ta = t === 0 ? a0\n\t\t\t\t\t: t === 1 ? a3\n\t\t\t\t\t: Curve.getPoint(v, t)[dir ? 'y' : 'x'],\n\t\t\t\twinding = o0 > o3 ? 1 : -1,\n\t\t\t\twindingPrev = vPrev[io] > vPrev[io + 6] ? 1 : -1,\n\t\t\t\ta3Prev = vPrev[ia + 6];\n\t\t\tif (po !== o0) {\n\t\t\t\tif (a < paL) {\n\t\t\t\t\tpathWindingL += winding;\n\t\t\t\t} else if (a > paR) {\n\t\t\t\t\tpathWindingR += winding;\n\t\t\t\t} else {\n\t\t\t\t\tonPath = true;\n\t\t\t\t}\n\t\t\t\tif (a > pa - qualityEpsilon && a < pa + qualityEpsilon)\n\t\t\t\t\tquality /= 2;\n\t\t\t} else {\n\t\t\t\tif (winding !== windingPrev) {\n\t\t\t\t\tif (a0 < paL) {\n\t\t\t\t\t\tpathWindingL += winding;\n\t\t\t\t\t} else if (a0 > paR) {\n\t\t\t\t\t\tpathWindingR += winding;\n\t\t\t\t\t}\n\t\t\t\t} else if (a0 != a3Prev) {\n\t\t\t\t\tif (a3Prev < paR && a > paR) {\n\t\t\t\t\t\tpathWindingR += winding;\n\t\t\t\t\t\tonPath = true;\n\t\t\t\t\t} else if (a3Prev > paL && a < paL) {\n\t\t\t\t\t\tpathWindingL += winding;\n\t\t\t\t\t\tonPath = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tquality /= 4;\n\t\t\t}\n\t\t\tvPrev = v;\n\t\t\treturn !dontFlip && a > paL && a < paR\n\t\t\t\t\t&& Curve.getTangent(v, t)[dir ? 'x' : 'y'] === 0\n\t\t\t\t\t&& getWinding(point, curves, !dir, closed, true);\n\t\t}\n\n\t\tfunction handleCurve(v) {\n\t\t\tvar o0 = v[io + 0],\n\t\t\t\to1 = v[io + 2],\n\t\t\t\to2 = v[io + 4],\n\t\t\t\to3 = v[io + 6];\n\t\t\tif (po <= max(o0, o1, o2, o3) && po >= min(o0, o1, o2, o3)) {\n\t\t\t\tvar a0 = v[ia + 0],\n\t\t\t\t\ta1 = v[ia + 2],\n\t\t\t\t\ta2 = v[ia + 4],\n\t\t\t\t\ta3 = v[ia + 6],\n\t\t\t\t\tmonoCurves = paL > max(a0, a1, a2, a3) ||\n\t\t\t\t\t\t\t\t paR < min(a0, a1, a2, a3)\n\t\t\t\t\t\t\t? [v] : Curve.getMonoCurves(v, dir),\n\t\t\t\t\tres;\n\t\t\t\tfor (var i = 0, l = monoCurves.length; i < l; i++) {\n\t\t\t\t\tif (res = addWinding(monoCurves[i]))\n\t\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (var i = 0, l = curvesList.length; i < l; i++) {\n\t\t\tvar curve = curvesList[i],\n\t\t\t\tpath = curve._path,\n\t\t\t\tv = curve.getValues(),\n\t\t\t\tres;\n\t\t\tif (!i || curvesList[i - 1]._path !== path) {\n\t\t\t\tvPrev = null;\n\t\t\t\tif (!path._closed) {\n\t\t\t\t\tvClose = Curve.getValues(\n\t\t\t\t\t\t\tpath.getLastCurve().getSegment2(),\n\t\t\t\t\t\t\tcurve.getSegment1(),\n\t\t\t\t\t\t\tnull, !closed);\n\t\t\t\t\tif (vClose[io] !== vClose[io + 6]) {\n\t\t\t\t\t\tvPrev = vClose;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!vPrev) {\n\t\t\t\t\tvPrev = v;\n\t\t\t\t\tvar prev = path.getLastCurve();\n\t\t\t\t\twhile (prev && prev !== curve) {\n\t\t\t\t\t\tvar v2 = prev.getValues();\n\t\t\t\t\t\tif (v2[io] !== v2[io + 6]) {\n\t\t\t\t\t\t\tvPrev = v2;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprev = prev.getPrevious();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (res = handleCurve(v))\n\t\t\t\treturn res;\n\n\t\t\tif (i + 1 === l || curvesList[i + 1]._path !== path) {\n\t\t\t\tif (vClose && (res = handleCurve(vClose)))\n\t\t\t\t\treturn res;\n\t\t\t\tif (onPath && !pathWindingL && !pathWindingR) {\n\t\t\t\t\tpathWindingL = pathWindingR = path.isClockwise(closed) ^ dir\n\t\t\t\t\t\t\t? 1 : -1;\n\t\t\t\t}\n\t\t\t\twindingL += pathWindingL;\n\t\t\t\twindingR += pathWindingR;\n\t\t\t\tpathWindingL = pathWindingR = 0;\n\t\t\t\tif (onPath) {\n\t\t\t\t\tonAnyPath = true;\n\t\t\t\t\tonPath = false;\n\t\t\t\t}\n\t\t\t\tvClose = null;\n\t\t\t}\n\t\t}\n\t\twindingL = abs(windingL);\n\t\twindingR = abs(windingR);\n\t\treturn {\n\t\t\twinding: max(windingL, windingR),\n\t\t\twindingL: windingL,\n\t\t\twindingR: windingR,\n\t\t\tquality: quality,\n\t\t\tonPath: onAnyPath\n\t\t};\n\t}\n\n\tfunction propagateWinding(segment, path1, path2, curveCollisionsMap,\n\t\t\toperator) {\n\t\tvar chain = [],\n\t\t\tstart = segment,\n\t\t\ttotalLength = 0,\n\t\t\twinding;\n\t\tdo {\n\t\t\tvar curve = segment.getCurve();\n\t\t\tif (curve) {\n\t\t\t\tvar length = curve.getLength();\n\t\t\t\tchain.push({ segment: segment, curve: curve, length: length });\n\t\t\t\ttotalLength += length;\n\t\t\t}\n\t\t\tsegment = segment.getNext();\n\t\t} while (segment && !segment._intersection && segment !== start);\n\t\tvar offsets = [0.5, 0.25, 0.75],\n\t\t\twinding = { winding: 0, quality: -1 },\n\t\t\ttMin = 1e-3,\n\t\t\ttMax = 1 - tMin;\n\t\tfor (var i = 0; i < offsets.length && winding.quality < 0.5; i++) {\n\t\t\tvar length = totalLength * offsets[i];\n\t\t\tfor (var j = 0, l = chain.length; j < l; j++) {\n\t\t\t\tvar entry = chain[j],\n\t\t\t\t\tcurveLength = entry.length;\n\t\t\t\tif (length <= curveLength) {\n\t\t\t\t\tvar curve = entry.curve,\n\t\t\t\t\t\tpath = curve._path,\n\t\t\t\t\t\tparent = path._parent,\n\t\t\t\t\t\toperand = parent instanceof CompoundPath ? parent : path,\n\t\t\t\t\t\tt = Numerical.clamp(curve.getTimeAt(length), tMin, tMax),\n\t\t\t\t\t\tpt = curve.getPointAtTime(t),\n\t\t\t\t\t\tdir = abs(curve.getTangentAtTime(t).y) < Math.SQRT1_2;\n\t\t\t\t\tvar wind = null;\n\t\t\t\t\tif (operator.subtract && path2) {\n\t\t\t\t\t\tvar otherPath = operand === path1 ? path2 : path1,\n\t\t\t\t\t\t\tpathWinding = otherPath._getWinding(pt, dir, true);\n\t\t\t\t\t\tif (operand === path1 && pathWinding.winding ||\n\t\t\t\t\t\t\toperand === path2 && !pathWinding.winding) {\n\t\t\t\t\t\t\tif (pathWinding.quality < 1) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twind = { winding: 0, quality: 1 };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\twind = wind || getWinding(\n\t\t\t\t\t\t\tpt, curveCollisionsMap[path._id][curve.getIndex()],\n\t\t\t\t\t\t\tdir, true);\n\t\t\t\t\tif (wind.quality > winding.quality)\n\t\t\t\t\t\twinding = wind;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tlength -= curveLength;\n\t\t\t}\n\t\t}\n\t\tfor (var j = chain.length - 1; j >= 0; j--) {\n\t\t\tchain[j].segment._winding = winding;\n\t\t}\n\t}\n\n\tfunction tracePaths(segments, operator) {\n\t\tvar paths = [],\n\t\t\tstarts;\n\n\t\tfunction isValid(seg) {\n\t\t\tvar winding;\n\t\t\treturn !!(seg && !seg._visited && (!operator\n\t\t\t\t\t|| operator[(winding = seg._winding || {}).winding]\n\t\t\t\t\t\t&& !(operator.unite && winding.winding === 2\n\t\t\t\t\t\t\t&& winding.windingL && winding.windingR)));\n\t\t}\n\n\t\tfunction isStart(seg) {\n\t\t\tif (seg) {\n\t\t\t\tfor (var i = 0, l = starts.length; i < l; i++) {\n\t\t\t\t\tif (seg === starts[i])\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tfunction visitPath(path) {\n\t\t\tvar segments = path._segments;\n\t\t\tfor (var i = 0, l = segments.length; i < l; i++) {\n\t\t\t\tsegments[i]._visited = true;\n\t\t\t}\n\t\t}\n\n\t\tfunction getCrossingSegments(segment, collectStarts) {\n\t\t\tvar inter = segment._intersection,\n\t\t\t\tstart = inter,\n\t\t\t\tcrossings = [];\n\t\t\tif (collectStarts)\n\t\t\t\tstarts = [segment];\n\n\t\t\tfunction collect(inter, end) {\n\t\t\t\twhile (inter && inter !== end) {\n\t\t\t\t\tvar other = inter._segment,\n\t\t\t\t\t\tpath = other && other._path;\n\t\t\t\t\tif (path) {\n\t\t\t\t\t\tvar next = other.getNext() || path.getFirstSegment(),\n\t\t\t\t\t\t\tnextInter = next._intersection;\n\t\t\t\t\t\tif (other !== segment && (isStart(other)\n\t\t\t\t\t\t\t|| isStart(next)\n\t\t\t\t\t\t\t|| next && (isValid(other) && (isValid(next)\n\t\t\t\t\t\t\t\t|| nextInter && isValid(nextInter._segment))))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcrossings.push(other);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (collectStarts)\n\t\t\t\t\t\t\tstarts.push(other);\n\t\t\t\t\t}\n\t\t\t\t\tinter = inter._next;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (inter) {\n\t\t\t\tcollect(inter);\n\t\t\t\twhile (inter && inter._previous)\n\t\t\t\t\tinter = inter._previous;\n\t\t\t\tcollect(inter, start);\n\t\t\t}\n\t\t\treturn crossings;\n\t\t}\n\n\t\tsegments.sort(function(seg1, seg2) {\n\t\t\tvar inter1 = seg1._intersection,\n\t\t\t\tinter2 = seg2._intersection,\n\t\t\t\tover1 = !!(inter1 && inter1._overlap),\n\t\t\t\tover2 = !!(inter2 && inter2._overlap),\n\t\t\t\tpath1 = seg1._path,\n\t\t\t\tpath2 = seg2._path;\n\t\t\treturn over1 ^ over2\n\t\t\t\t\t? over1 ? 1 : -1\n\t\t\t\t\t: !inter1 ^ !inter2\n\t\t\t\t\t\t? inter1 ? 1 : -1\n\t\t\t\t\t\t: path1 !== path2\n\t\t\t\t\t\t\t? path1._id - path2._id\n\t\t\t\t\t\t\t: seg1._index - seg2._index;\n\t\t});\n\n\t\tfor (var i = 0, l = segments.length; i < l; i++) {\n\t\t\tvar seg = segments[i],\n\t\t\t\tvalid = isValid(seg),\n\t\t\t\tpath = null,\n\t\t\t\tfinished = false,\n\t\t\t\tclosed = true,\n\t\t\t\tbranches = [],\n\t\t\t\tbranch,\n\t\t\t\tvisited,\n\t\t\t\thandleIn;\n\t\t\tif (valid && seg._path._overlapsOnly) {\n\t\t\t\tvar path1 = seg._path,\n\t\t\t\t\tpath2 = seg._intersection._segment._path;\n\t\t\t\tif (path1.compare(path2)) {\n\t\t\t\t\tif (path1.getArea())\n\t\t\t\t\t\tpaths.push(path1.clone(false));\n\t\t\t\t\tvisitPath(path1);\n\t\t\t\t\tvisitPath(path2);\n\t\t\t\t\tvalid = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile (valid) {\n\t\t\t\tvar first = !path,\n\t\t\t\t\tcrossings = getCrossingSegments(seg, first),\n\t\t\t\t\tother = crossings.shift(),\n\t\t\t\t\tfinished = !first && (isStart(seg) || isStart(other)),\n\t\t\t\t\tcross = !finished && other;\n\t\t\t\tif (first) {\n\t\t\t\t\tpath = new Path(Item.NO_INSERT);\n\t\t\t\t\tbranch = null;\n\t\t\t\t}\n\t\t\t\tif (finished) {\n\t\t\t\t\tif (seg.isFirst() || seg.isLast())\n\t\t\t\t\t\tclosed = seg._path._closed;\n\t\t\t\t\tseg._visited = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (cross && branch) {\n\t\t\t\t\tbranches.push(branch);\n\t\t\t\t\tbranch = null;\n\t\t\t\t}\n\t\t\t\tif (!branch) {\n\t\t\t\t\tif (cross)\n\t\t\t\t\t\tcrossings.push(seg);\n\t\t\t\t\tbranch = {\n\t\t\t\t\t\tstart: path._segments.length,\n\t\t\t\t\t\tcrossings: crossings,\n\t\t\t\t\t\tvisited: visited = [],\n\t\t\t\t\t\thandleIn: handleIn\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (cross)\n\t\t\t\t\tseg = other;\n\t\t\t\tif (!isValid(seg)) {\n\t\t\t\t\tpath.removeSegments(branch.start);\n\t\t\t\t\tfor (var j = 0, k = visited.length; j < k; j++) {\n\t\t\t\t\t\tvisited[j]._visited = false;\n\t\t\t\t\t}\n\t\t\t\t\tvisited.length = 0;\n\t\t\t\t\tdo {\n\t\t\t\t\t\tseg = branch && branch.crossings.shift();\n\t\t\t\t\t\tif (!seg || !seg._path) {\n\t\t\t\t\t\t\tseg = null;\n\t\t\t\t\t\t\tbranch = branches.pop();\n\t\t\t\t\t\t\tif (branch) {\n\t\t\t\t\t\t\t\tvisited = branch.visited;\n\t\t\t\t\t\t\t\thandleIn = branch.handleIn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} while (branch && !isValid(seg));\n\t\t\t\t\tif (!seg)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tvar next = seg.getNext();\n\t\t\t\tpath.add(new Segment(seg._point, handleIn,\n\t\t\t\t\t\tnext && seg._handleOut));\n\t\t\t\tseg._visited = true;\n\t\t\t\tvisited.push(seg);\n\t\t\t\tseg = next || seg._path.getFirstSegment();\n\t\t\t\thandleIn = next && next._handleIn;\n\t\t\t}\n\t\t\tif (finished) {\n\t\t\t\tif (closed) {\n\t\t\t\t\tpath.getFirstSegment().setHandleIn(handleIn);\n\t\t\t\t\tpath.setClosed(closed);\n\t\t\t\t}\n\t\t\t\tif (path.getArea() !== 0) {\n\t\t\t\t\tpaths.push(path);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn paths;\n\t}\n\n\treturn {\n\t\t_getWinding: function(point, dir, closed) {\n\t\t\treturn getWinding(point, this.getCurves(), dir, closed);\n\t\t},\n\n\t\tunite: function(path, options) {\n\t\t\treturn traceBoolean(this, path, 'unite', options);\n\t\t},\n\n\t\tintersect: function(path, options) {\n\t\t\treturn traceBoolean(this, path, 'intersect', options);\n\t\t},\n\n\t\tsubtract: function(path, options) {\n\t\t\treturn traceBoolean(this, path, 'subtract', options);\n\t\t},\n\n\t\texclude: function(path, options) {\n\t\t\treturn traceBoolean(this, path, 'exclude', options);\n\t\t},\n\n\t\tdivide: function(path, options) {\n\t\t\treturn options && (options.trace == false || options.stroke)\n\t\t\t\t\t? splitBoolean(this, path, 'divide')\n\t\t\t\t\t: createResult([\n\t\t\t\t\t\tthis.subtract(path, options),\n\t\t\t\t\t\tthis.intersect(path, options)\n\t\t\t\t\t], true, this, path, options);\n\t\t},\n\n\t\tresolveCrossings: function() {\n\t\t\tvar children = this._children,\n\t\t\t\tpaths = children || [this];\n\n\t\t\tfunction hasOverlap(seg, path) {\n\t\t\t\tvar inter = seg && seg._intersection;\n\t\t\t\treturn inter && inter._overlap && inter._path === path;\n\t\t\t}\n\n\t\t\tvar hasOverlaps = false,\n\t\t\t\thasCrossings = false,\n\t\t\t\tintersections = this.getIntersections(null, function(inter) {\n\t\t\t\t\treturn inter.hasOverlap() && (hasOverlaps = true) ||\n\t\t\t\t\t\t\tinter.isCrossing() && (hasCrossings = true);\n\t\t\t\t}),\n\t\t\t\tclearCurves = hasOverlaps && hasCrossings && [];\n\t\t\tintersections = CurveLocation.expand(intersections);\n\t\t\tif (hasOverlaps) {\n\t\t\t\tvar overlaps = divideLocations(intersections, function(inter) {\n\t\t\t\t\treturn inter.hasOverlap();\n\t\t\t\t}, clearCurves);\n\t\t\t\tfor (var i = overlaps.length - 1; i >= 0; i--) {\n\t\t\t\t\tvar overlap = overlaps[i],\n\t\t\t\t\t\tpath = overlap._path,\n\t\t\t\t\t\tseg = overlap._segment,\n\t\t\t\t\t\tprev = seg.getPrevious(),\n\t\t\t\t\t\tnext = seg.getNext();\n\t\t\t\t\tif (hasOverlap(prev, path) && hasOverlap(next, path)) {\n\t\t\t\t\t\tseg.remove();\n\t\t\t\t\t\tprev._handleOut._set(0, 0);\n\t\t\t\t\t\tnext._handleIn._set(0, 0);\n\t\t\t\t\t\tif (prev !== seg && !prev.getCurve().hasLength()) {\n\t\t\t\t\t\t\tnext._handleIn.set(prev._handleIn);\n\t\t\t\t\t\t\tprev.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (hasCrossings) {\n\t\t\t\tdivideLocations(intersections, hasOverlaps && function(inter) {\n\t\t\t\t\tvar curve1 = inter.getCurve(),\n\t\t\t\t\t\tseg1 = inter.getSegment(),\n\t\t\t\t\t\tother = inter._intersection,\n\t\t\t\t\t\tcurve2 = other._curve,\n\t\t\t\t\t\tseg2 = other._segment;\n\t\t\t\t\tif (curve1 && curve2 && curve1._path && curve2._path)\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tif (seg1)\n\t\t\t\t\t\tseg1._intersection = null;\n\t\t\t\t\tif (seg2)\n\t\t\t\t\t\tseg2._intersection = null;\n\t\t\t\t}, clearCurves);\n\t\t\t\tif (clearCurves)\n\t\t\t\t\tclearCurveHandles(clearCurves);\n\t\t\t\tpaths = tracePaths(Base.each(paths, function(path) {\n\t\t\t\t\tBase.push(this, path._segments);\n\t\t\t\t}, []));\n\t\t\t}\n\t\t\tvar length = paths.length,\n\t\t\t\titem;\n\t\t\tif (length > 1 && children) {\n\t\t\t\tif (paths !== children)\n\t\t\t\t\tthis.setChildren(paths);\n\t\t\t\titem = this;\n\t\t\t} else if (length === 1 && !children) {\n\t\t\t\tif (paths[0] !== this)\n\t\t\t\t\tthis.setSegments(paths[0].removeSegments());\n\t\t\t\titem = this;\n\t\t\t}\n\t\t\tif (!item) {\n\t\t\t\titem = new CompoundPath(Item.NO_INSERT);\n\t\t\t\titem.addChildren(paths);\n\t\t\t\titem = item.reduce();\n\t\t\t\titem.copyAttributes(this);\n\t\t\t\tthis.replaceWith(item);\n\t\t\t}\n\t\t\treturn item;\n\t\t},\n\n\t\treorient: function(nonZero, clockwise) {\n\t\t\tvar children = this._children;\n\t\t\tif (children && children.length) {\n\t\t\t\tthis.setChildren(reorientPaths(this.removeChildren(),\n\t\t\t\t\t\tfunction(w) {\n\t\t\t\t\t\t\treturn !!(nonZero ? w : w & 1);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tclockwise));\n\t\t\t} else if (clockwise !== undefined) {\n\t\t\t\tthis.setClockwise(clockwise);\n\t\t\t}\n\t\t\treturn this;\n\t\t},\n\n\t\tgetInteriorPoint: function() {\n\t\t\tvar bounds = this.getBounds(),\n\t\t\t\tpoint = bounds.getCenter(true);\n\t\t\tif (!this.contains(point)) {\n\t\t\t\tvar curves = this.getCurves(),\n\t\t\t\t\ty = point.y,\n\t\t\t\t\tintercepts = [],\n\t\t\t\t\troots = [];\n\t\t\t\tfor (var i = 0, l = curves.length; i < l; i++) {\n\t\t\t\t\tvar v = curves[i].getValues(),\n\t\t\t\t\t\to0 = v[1],\n\t\t\t\t\t\to1 = v[3],\n\t\t\t\t\t\to2 = v[5],\n\t\t\t\t\t\to3 = v[7];\n\t\t\t\t\tif (y >= min(o0, o1, o2, o3) && y <= max(o0, o1, o2, o3)) {\n\t\t\t\t\t\tvar monoCurves = Curve.getMonoCurves(v);\n\t\t\t\t\t\tfor (var j = 0, m = monoCurves.length; j < m; j++) {\n\t\t\t\t\t\t\tvar mv = monoCurves[j],\n\t\t\t\t\t\t\t\tmo0 = mv[1],\n\t\t\t\t\t\t\t\tmo3 = mv[7];\n\t\t\t\t\t\t\tif ((mo0 !== mo3) &&\n\t\t\t\t\t\t\t\t(y >= mo0 && y <= mo3 || y >= mo3 && y <= mo0)){\n\t\t\t\t\t\t\t\tvar x = y === mo0 ? mv[0]\n\t\t\t\t\t\t\t\t\t: y === mo3 ? mv[6]\n\t\t\t\t\t\t\t\t\t: Curve.solveCubic(mv, 1, y, roots, 0, 1)\n\t\t\t\t\t\t\t\t\t\t=== 1\n\t\t\t\t\t\t\t\t\t\t? Curve.getPoint(mv, roots[0]).x\n\t\t\t\t\t\t\t\t\t\t: (mv[0] + mv[6]) / 2;\n\t\t\t\t\t\t\t\tintercepts.push(x);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (intercepts.length > 1) {\n\t\t\t\t\tintercepts.sort(function(a, b) { return a - b; });\n\t\t\t\t\tpoint.x = (intercepts[0] + intercepts[1]) / 2;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn point;\n\t\t}\n\t};\n});\n\nvar PathFlattener = Base.extend({\n\t_class: 'PathFlattener',\n\n\tinitialize: function(path, flatness, maxRecursion, ignoreStraight, matrix) {\n\t\tvar curves = [],\n\t\t\tparts = [],\n\t\t\tlength = 0,\n\t\t\tminSpan = 1 / (maxRecursion || 32),\n\t\t\tsegments = path._segments,\n\t\t\tsegment1 = segments[0],\n\t\t\tsegment2;\n\n\t\tfunction addCurve(segment1, segment2) {\n\t\t\tvar curve = Curve.getValues(segment1, segment2, matrix);\n\t\t\tcurves.push(curve);\n\t\t\tcomputeParts(curve, segment1._index, 0, 1);\n\t\t}\n\n\t\tfunction computeParts(curve, index, t1, t2) {\n\t\t\tif ((t2 - t1) > minSpan\n\t\t\t\t\t&& !(ignoreStraight && Curve.isStraight(curve))\n\t\t\t\t\t&& !Curve.isFlatEnough(curve, flatness || 0.25)) {\n\t\t\t\tvar halves = Curve.subdivide(curve, 0.5),\n\t\t\t\t\ttMid = (t1 + t2) / 2;\n\t\t\t\tcomputeParts(halves[0], index, t1, tMid);\n\t\t\t\tcomputeParts(halves[1], index, tMid, t2);\n\t\t\t} else {\n\t\t\t\tvar dx = curve[6] - curve[0],\n\t\t\t\t\tdy = curve[7] - curve[1],\n\t\t\t\t\tdist = Math.sqrt(dx * dx + dy * dy);\n\t\t\t\tif (dist > 0) {\n\t\t\t\t\tlength += dist;\n\t\t\t\t\tparts.push({\n\t\t\t\t\t\toffset: length,\n\t\t\t\t\t\tcurve: curve,\n\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\ttime: t2,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (var i = 1, l = segments.length; i < l; i++) {\n\t\t\tsegment2 = segments[i];\n\t\t\taddCurve(segment1, segment2);\n\t\t\tsegment1 = segment2;\n\t\t}\n\t\tif (path._closed)\n\t\t\taddCurve(segment2 || segment1, segments[0]);\n\t\tthis.curves = curves;\n\t\tthis.parts = parts;\n\t\tthis.length = length;\n\t\tthis.index = 0;\n\t},\n\n\t_get: function(offset) {\n\t\tvar parts = this.parts,\n\t\t\tlength = parts.length,\n\t\t\tstart,\n\t\t\ti, j = this.index;\n\t\tfor (;;) {\n\t\t\ti = j;\n\t\t\tif (!j || parts[--j].offset < offset)\n\t\t\t\tbreak;\n\t\t}\n\t\tfor (; i < length; i++) {\n\t\t\tvar part = parts[i];\n\t\t\tif (part.offset >= offset) {\n\t\t\t\tthis.index = i;\n\t\t\t\tvar prev = parts[i - 1],\n\t\t\t\t\tprevTime = prev && prev.index === part.index ? prev.time : 0,\n\t\t\t\t\tprevOffset = prev ? prev.offset : 0;\n\t\t\t\treturn {\n\t\t\t\t\tindex: part.index,\n\t\t\t\t\ttime: prevTime + (part.time - prevTime)\n\t\t\t\t\t\t* (offset - prevOffset) / (part.offset - prevOffset)\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tindex: parts[length - 1].index,\n\t\t\ttime: 1\n\t\t};\n\t},\n\n\tdrawPart: function(ctx, from, to) {\n\t\tvar start = this._get(from),\n\t\t\tend = this._get(to);\n\t\tfor (var i = start.index, l = end.index; i <= l; i++) {\n\t\t\tvar curve = Curve.getPart(this.curves[i],\n\t\t\t\t\ti === start.index ? start.time : 0,\n\t\t\t\t\ti === end.index ? end.time : 1);\n\t\t\tif (i === start.index)\n\t\t\t\tctx.moveTo(curve[0], curve[1]);\n\t\t\tctx.bezierCurveTo.apply(ctx, curve.slice(2));\n\t\t}\n\t}\n}, Base.each(Curve._evaluateMethods,\n\tfunction(name) {\n\t\tthis[name + 'At'] = function(offset) {\n\t\t\tvar param = this._get(offset);\n\t\t\treturn Curve[name](this.curves[param.index], param.time);\n\t\t};\n\t}, {})\n);\n\nvar PathFitter = Base.extend({\n\tinitialize: function(path) {\n\t\tvar points = this.points = [],\n\t\t\tsegments = path._segments,\n\t\t\tclosed = path._closed;\n\t\tfor (var i = 0, prev, l = segments.length; i < l; i++) {\n\t\t\tvar point = segments[i].point;\n\t\t\tif (!prev || !prev.equals(point)) {\n\t\t\t\tpoints.push(prev = point.clone());\n\t\t\t}\n\t\t}\n\t\tif (closed) {\n\t\t\tpoints.unshift(points[points.length - 1]);\n\t\t\tpoints.push(points[1]);\n\t\t}\n\t\tthis.closed = closed;\n\t},\n\n\tfit: function(error) {\n\t\tvar points = this.points,\n\t\t\tlength = points.length,\n\t\t\tsegments = null;\n\t\tif (length > 0) {\n\t\t\tsegments = [new Segment(points[0])];\n\t\t\tif (length > 1) {\n\t\t\t\tthis.fitCubic(segments, error, 0, length - 1,\n\t\t\t\t\t\tpoints[1].subtract(points[0]),\n\t\t\t\t\t\tpoints[length - 2].subtract(points[length - 1]));\n\t\t\t\tif (this.closed) {\n\t\t\t\t\tsegments.shift();\n\t\t\t\t\tsegments.pop();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn segments;\n\t},\n\n\tfitCubic: function(segments, error, first, last, tan1, tan2) {\n\t\tvar points = this.points;\n\t\tif (last - first === 1) {\n\t\t\tvar pt1 = points[first],\n\t\t\t\tpt2 = points[last],\n\t\t\t\tdist = pt1.getDistance(pt2) / 3;\n\t\t\tthis.addCurve(segments, [pt1, pt1.add(tan1.normalize(dist)),\n\t\t\t\t\tpt2.add(tan2.normalize(dist)), pt2]);\n\t\t\treturn;\n\t\t}\n\t\tvar uPrime = this.chordLengthParameterize(first, last),\n\t\t\tmaxError = Math.max(error, error * error),\n\t\t\tsplit,\n\t\t\tparametersInOrder = true;\n\t\tfor (var i = 0; i <= 4; i++) {\n\t\t\tvar curve = this.generateBezier(first, last, uPrime, tan1, tan2);\n\t\t\tvar max = this.findMaxError(first, last, curve, uPrime);\n\t\t\tif (max.error < error && parametersInOrder) {\n\t\t\t\tthis.addCurve(segments, curve);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsplit = max.index;\n\t\t\tif (max.error >= maxError)\n\t\t\t\tbreak;\n\t\t\tparametersInOrder = this.reparameterize(first, last, uPrime, curve);\n\t\t\tmaxError = max.error;\n\t\t}\n\t\tvar tanCenter = points[split - 1].subtract(points[split + 1]);\n\t\tthis.fitCubic(segments, error, first, split, tan1, tanCenter);\n\t\tthis.fitCubic(segments, error, split, last, tanCenter.negate(), tan2);\n\t},\n\n\taddCurve: function(segments, curve) {\n\t\tvar prev = segments[segments.length - 1];\n\t\tprev.setHandleOut(curve[1].subtract(curve[0]));\n\t\tsegments.push(new Segment(curve[3], curve[2].subtract(curve[3])));\n\t},\n\n\tgenerateBezier: function(first, last, uPrime, tan1, tan2) {\n\t\tvar epsilon = 1e-12,\n\t\t\tabs = Math.abs,\n\t\t\tpoints = this.points,\n\t\t\tpt1 = points[first],\n\t\t\tpt2 = points[last],\n\t\t\tC = [[0, 0], [0, 0]],\n\t\t\tX = [0, 0];\n\n\t\tfor (var i = 0, l = last - first + 1; i < l; i++) {\n\t\t\tvar u = uPrime[i],\n\t\t\t\tt = 1 - u,\n\t\t\t\tb = 3 * u * t,\n\t\t\t\tb0 = t * t * t,\n\t\t\t\tb1 = b * t,\n\t\t\t\tb2 = b * u,\n\t\t\t\tb3 = u * u * u,\n\t\t\t\ta1 = tan1.normalize(b1),\n\t\t\t\ta2 = tan2.normalize(b2),\n\t\t\t\ttmp = points[first + i]\n\t\t\t\t\t.subtract(pt1.multiply(b0 + b1))\n\t\t\t\t\t.subtract(pt2.multiply(b2 + b3));\n\t\t\tC[0][0] += a1.dot(a1);\n\t\t\tC[0][1] += a1.dot(a2);\n\t\t\tC[1][0] = C[0][1];\n\t\t\tC[1][1] += a2.dot(a2);\n\t\t\tX[0] += a1.dot(tmp);\n\t\t\tX[1] += a2.dot(tmp);\n\t\t}\n\n\t\tvar detC0C1 = C[0][0] * C[1][1] - C[1][0] * C[0][1],\n\t\t\talpha1,\n\t\t\talpha2;\n\t\tif (abs(detC0C1) > epsilon) {\n\t\t\tvar detC0X = C[0][0] * X[1] - C[1][0] * X[0],\n\t\t\t\tdetXC1 = X[0] * C[1][1] - X[1] * C[0][1];\n\t\t\talpha1 = detXC1 / detC0C1;\n\t\t\talpha2 = detC0X / detC0C1;\n\t\t} else {\n\t\t\tvar c0 = C[0][0] + C[0][1],\n\t\t\t\tc1 = C[1][0] + C[1][1];\n\t\t\talpha1 = alpha2 = abs(c0) > epsilon ? X[0] / c0\n\t\t\t\t\t\t\t: abs(c1) > epsilon ? X[1] / c1\n\t\t\t\t\t\t\t: 0;\n\t\t}\n\n\t\tvar segLength = pt2.getDistance(pt1),\n\t\t\teps = epsilon * segLength,\n\t\t\thandle1,\n\t\t\thandle2;\n\t\tif (alpha1 < eps || alpha2 < eps) {\n\t\t\talpha1 = alpha2 = segLength / 3;\n\t\t} else {\n\t\t\tvar line = pt2.subtract(pt1);\n\t\t\thandle1 = tan1.normalize(alpha1);\n\t\t\thandle2 = tan2.normalize(alpha2);\n\t\t\tif (handle1.dot(line) - handle2.dot(line) > segLength * segLength) {\n\t\t\t\talpha1 = alpha2 = segLength / 3;\n\t\t\t\thandle1 = handle2 = null;\n\t\t\t}\n\t\t}\n\n\t\treturn [pt1,\n\t\t\t\tpt1.add(handle1 || tan1.normalize(alpha1)),\n\t\t\t\tpt2.add(handle2 || tan2.normalize(alpha2)),\n\t\t\t\tpt2];\n\t},\n\n\treparameterize: function(first, last, u, curve) {\n\t\tfor (var i = first; i <= last; i++) {\n\t\t\tu[i - first] = this.findRoot(curve, this.points[i], u[i - first]);\n\t\t}\n\t\tfor (var i = 1, l = u.length; i < l; i++) {\n\t\t\tif (u[i] <= u[i - 1])\n\t\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\tfindRoot: function(curve, point, u) {\n\t\tvar curve1 = [],\n\t\t\tcurve2 = [];\n\t\tfor (var i = 0; i <= 2; i++) {\n\t\t\tcurve1[i] = curve[i + 1].subtract(curve[i]).multiply(3);\n\t\t}\n\t\tfor (var i = 0; i <= 1; i++) {\n\t\t\tcurve2[i] = curve1[i + 1].subtract(curve1[i]).multiply(2);\n\t\t}\n\t\tvar pt = this.evaluate(3, curve, u),\n\t\t\tpt1 = this.evaluate(2, curve1, u),\n\t\t\tpt2 = this.evaluate(1, curve2, u),\n\t\t\tdiff = pt.subtract(point),\n\t\t\tdf = pt1.dot(pt1) + diff.dot(pt2);\n\t\treturn Numerical.isMachineZero(df) ? u : u - diff.dot(pt1) / df;\n\t},\n\n\tevaluate: function(degree, curve, t) {\n\t\tvar tmp = curve.slice();\n\t\tfor (var i = 1; i <= degree; i++) {\n\t\t\tfor (var j = 0; j <= degree - i; j++) {\n\t\t\t\ttmp[j] = tmp[j].multiply(1 - t).add(tmp[j + 1].multiply(t));\n\t\t\t}\n\t\t}\n\t\treturn tmp[0];\n\t},\n\n\tchordLengthParameterize: function(first, last) {\n\t\tvar u = [0];\n\t\tfor (var i = first + 1; i <= last; i++) {\n\t\t\tu[i - first] = u[i - first - 1]\n\t\t\t\t\t+ this.points[i].getDistance(this.points[i - 1]);\n\t\t}\n\t\tfor (var i = 1, m = last - first; i <= m; i++) {\n\t\t\tu[i] /= u[m];\n\t\t}\n\t\treturn u;\n\t},\n\n\tfindMaxError: function(first, last, curve, u) {\n\t\tvar index = Math.floor((last - first + 1) / 2),\n\t\t\tmaxDist = 0;\n\t\tfor (var i = first + 1; i < last; i++) {\n\t\t\tvar P = this.evaluate(3, curve, u[i - first]);\n\t\t\tvar v = P.subtract(this.points[i]);\n\t\t\tvar dist = v.x * v.x + v.y * v.y;\n\t\t\tif (dist >= maxDist) {\n\t\t\t\tmaxDist = dist;\n\t\t\t\tindex = i;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\terror: maxDist,\n\t\t\tindex: index\n\t\t};\n\t}\n});\n\nvar TextItem = Item.extend({\n\t_class: 'TextItem',\n\t_applyMatrix: false,\n\t_canApplyMatrix: false,\n\t_serializeFields: {\n\t\tcontent: null\n\t},\n\t_boundsOptions: { stroke: false, handle: false },\n\n\tinitialize: function TextItem(arg) {\n\t\tthis._content = '';\n\t\tthis._lines = [];\n\t\tvar hasProps = arg && Base.isPlainObject(arg)\n\t\t\t\t&& arg.x === undefined && arg.y === undefined;\n\t\tthis._initialize(hasProps && arg, !hasProps && Point.read(arguments));\n\t},\n\n\t_equals: function(item) {\n\t\treturn this._content === item._content;\n\t},\n\n\tcopyContent: function(source) {\n\t\tthis.setContent(source._content);\n\t},\n\n\tgetContent: function() {\n\t\treturn this._content;\n\t},\n\n\tsetContent: function(content) {\n\t\tthis._content = '' + content;\n\t\tthis._lines = this._content.split(/\\r\\n|\\n|\\r/mg);\n\t\tthis._changed(521);\n\t},\n\n\tisEmpty: function() {\n\t\treturn !this._content;\n\t},\n\n\tgetCharacterStyle: '#getStyle',\n\tsetCharacterStyle: '#setStyle',\n\n\tgetParagraphStyle: '#getStyle',\n\tsetParagraphStyle: '#setStyle'\n});\n\nvar PointText = TextItem.extend({\n\t_class: 'PointText',\n\n\tinitialize: function PointText() {\n\t\tTextItem.apply(this, arguments);\n\t},\n\n\tgetPoint: function() {\n\t\tvar point = this._matrix.getTranslation();\n\t\treturn new LinkedPoint(point.x, point.y, this, 'setPoint');\n\t},\n\n\tsetPoint: function() {\n\t\tvar point = Point.read(arguments);\n\t\tthis.translate(point.subtract(this._matrix.getTranslation()));\n\t},\n\n\t_draw: function(ctx, param, viewMatrix) {\n\t\tif (!this._content)\n\t\t\treturn;\n\t\tthis._setStyles(ctx, param, viewMatrix);\n\t\tvar lines = this._lines,\n\t\t\tstyle = this._style,\n\t\t\thasFill = style.hasFill(),\n\t\t\thasStroke = style.hasStroke(),\n\t\t\tleading = style.getLeading(),\n\t\t\tshadowColor = ctx.shadowColor;\n\t\tctx.font = style.getFontStyle();\n\t\tctx.textAlign = style.getJustification();\n\t\tfor (var i = 0, l = lines.length; i < l; i++) {\n\t\t\tctx.shadowColor = shadowColor;\n\t\t\tvar line = lines[i];\n\t\t\tif (hasFill) {\n\t\t\t\tctx.fillText(line, 0, 0);\n\t\t\t\tctx.shadowColor = 'rgba(0,0,0,0)';\n\t\t\t}\n\t\t\tif (hasStroke)\n\t\t\t\tctx.strokeText(line, 0, 0);\n\t\t\tctx.translate(0, leading);\n\t\t}\n\t},\n\n\t_getBounds: function(matrix, options) {\n\t\tvar style = this._style,\n\t\t\tlines = this._lines,\n\t\t\tnumLines = lines.length,\n\t\t\tjustification = style.getJustification(),\n\t\t\tleading = style.getLeading(),\n\t\t\twidth = this.getView().getTextWidth(style.getFontStyle(), lines),\n\t\t\tx = 0;\n\t\tif (justification !== 'left')\n\t\t\tx -= width / (justification === 'center' ? 2: 1);\n\t\tvar rect = new Rectangle(x,\n\t\t\t\t\tnumLines ? - 0.75 * leading : 0,\n\t\t\t\t\twidth, numLines * leading);\n\t\treturn matrix ? matrix._transformBounds(rect, rect) : rect;\n\t}\n});\n\nvar Color = Base.extend(new function() {\n\tvar types = {\n\t\tgray: ['gray'],\n\t\trgb: ['red', 'green', 'blue'],\n\t\thsb: ['hue', 'saturation', 'brightness'],\n\t\thsl: ['hue', 'saturation', 'lightness'],\n\t\tgradient: ['gradient', 'origin', 'destination', 'highlight']\n\t};\n\n\tvar componentParsers = {},\n\t\tnamedColors = {\n\t\t\ttransparent: [0, 0, 0, 0]\n\t\t},\n\t\tcolorCtx;\n\n\tfunction fromCSS(string) {\n\t\tvar match = string.match(\n\t\t\t\t/^#([\\da-f]{2})([\\da-f]{2})([\\da-f]{2})([\\da-f]{2})?$/i\n\t\t\t) || string.match(\n\t\t\t\t/^#([\\da-f])([\\da-f])([\\da-f])([\\da-f])?$/i\n\t\t\t),\n\t\t\ttype = 'rgb',\n\t\t\tcomponents;\n\t\tif (match) {\n\t\t\tvar amount = match[4] ? 4 : 3;\n\t\t\tcomponents = new Array(amount);\n\t\t\tfor (var i = 0; i < amount; i++) {\n\t\t\t\tvar value = match[i + 1];\n\t\t\t\tcomponents[i] = parseInt(value.length == 1\n\t\t\t\t\t\t? value + value : value, 16) / 255;\n\t\t\t}\n\t\t} else if (match = string.match(/^(rgb|hsl)a?\\((.*)\\)$/)) {\n\t\t\ttype = match[1];\n\t\t\tcomponents = match[2].trim().split(/[,\\s]+/g);\n\t\t\tvar isHSL = type === 'hsl';\n\t\t\tfor (var i = 0, l = Math.min(components.length, 4); i < l; i++) {\n\t\t\t\tvar component = components[i];\n\t\t\t\tvar value = parseFloat(component);\n\t\t\t\tif (isHSL) {\n\t\t\t\t\tif (i === 0) {\n\t\t\t\t\t\tvar unit = component.match(/([a-z]*)$/)[1];\n\t\t\t\t\t\tvalue *= ({\n\t\t\t\t\t\t\tturn: 360,\n\t\t\t\t\t\t\trad: 180 / Math.PI,\n\t\t\t\t\t\t\tgrad: 0.9\n\t\t\t\t\t\t}[unit] || 1);\n\t\t\t\t\t} else if (i < 3) {\n\t\t\t\t\t\tvalue /= 100;\n\t\t\t\t\t}\n\t\t\t\t} else if (i < 3) {\n\t\t\t\t\tvalue /= /%$/.test(component) ? 100 : 255;\n\t\t\t\t}\n\t\t\t\tcomponents[i] = value;\n\t\t\t}\n\t\t} else {\n\t\t\tvar color = namedColors[string];\n\t\t\tif (!color) {\n\t\t\t\tif (window) {\n\t\t\t\t\tif (!colorCtx) {\n\t\t\t\t\t\tcolorCtx = CanvasProvider.getContext(1, 1, {\n\t\t\t\t\t\t\twillReadFrequently: true\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcolorCtx.globalCompositeOperation = 'copy';\n\t\t\t\t\t}\n\t\t\t\t\tcolorCtx.fillStyle = 'rgba(0,0,0,0)';\n\t\t\t\t\tcolorCtx.fillStyle = string;\n\t\t\t\t\tcolorCtx.fillRect(0, 0, 1, 1);\n\t\t\t\t\tvar data = colorCtx.getImageData(0, 0, 1, 1).data;\n\t\t\t\t\tcolor = namedColors[string] = [\n\t\t\t\t\t\tdata[0] / 255,\n\t\t\t\t\t\tdata[1] / 255,\n\t\t\t\t\t\tdata[2] / 255\n\t\t\t\t\t];\n\t\t\t\t} else {\n\t\t\t\t\tcolor = [0, 0, 0];\n\t\t\t\t}\n\t\t\t}\n\t\t\tcomponents = color.slice();\n\t\t}\n\t\treturn [type, components];\n\t}\n\n\tvar hsbIndices = [\n\t\t[0, 3, 1],\n\t\t[2, 0, 1],\n\t\t[1, 0, 3],\n\t\t[1, 2, 0],\n\t\t[3, 1, 0],\n\t\t[0, 1, 2]\n\t];\n\n\tvar converters = {\n\t\t'rgb-hsb': function(r, g, b) {\n\t\t\tvar max = Math.max(r, g, b),\n\t\t\t\tmin = Math.min(r, g, b),\n\t\t\t\tdelta = max - min,\n\t\t\t\th = delta === 0 ? 0\n\t\t\t\t\t: ( max == r ? (g - b) / delta + (g < b ? 6 : 0)\n\t\t\t\t\t\t: max == g ? (b - r) / delta + 2\n\t\t\t\t\t\t: (r - g) / delta + 4) * 60;\n\t\t\treturn [h, max === 0 ? 0 : delta / max, max];\n\t\t},\n\n\t\t'hsb-rgb': function(h, s, b) {\n\t\t\th = (((h / 60) % 6) + 6) % 6;\n\t\t\tvar i = Math.floor(h),\n\t\t\t\tf = h - i,\n\t\t\t\ti = hsbIndices[i],\n\t\t\t\tv = [\n\t\t\t\t\tb,\n\t\t\t\t\tb * (1 - s),\n\t\t\t\t\tb * (1 - s * f),\n\t\t\t\t\tb * (1 - s * (1 - f))\n\t\t\t\t];\n\t\t\treturn [v[i[0]], v[i[1]], v[i[2]]];\n\t\t},\n\n\t\t'rgb-hsl': function(r, g, b) {\n\t\t\tvar max = Math.max(r, g, b),\n\t\t\t\tmin = Math.min(r, g, b),\n\t\t\t\tdelta = max - min,\n\t\t\t\tachromatic = delta === 0,\n\t\t\t\th = achromatic ? 0\n\t\t\t\t\t: ( max == r ? (g - b) / delta + (g < b ? 6 : 0)\n\t\t\t\t\t\t: max == g ? (b - r) / delta + 2\n\t\t\t\t\t\t: (r - g) / delta + 4) * 60,\n\t\t\t\tl = (max + min) / 2,\n\t\t\t\ts = achromatic ? 0 : l < 0.5\n\t\t\t\t\t\t? delta / (max + min)\n\t\t\t\t\t\t: delta / (2 - max - min);\n\t\t\treturn [h, s, l];\n\t\t},\n\n\t\t'hsl-rgb': function(h, s, l) {\n\t\t\th = (((h / 360) % 1) + 1) % 1;\n\t\t\tif (s === 0)\n\t\t\t\treturn [l, l, l];\n\t\t\tvar t3s = [ h + 1 / 3, h, h - 1 / 3 ],\n\t\t\t\tt2 = l < 0.5 ? l * (1 + s) : l + s - l * s,\n\t\t\t\tt1 = 2 * l - t2,\n\t\t\t\tc = [];\n\t\t\tfor (var i = 0; i < 3; i++) {\n\t\t\t\tvar t3 = t3s[i];\n\t\t\t\tif (t3 < 0) t3 += 1;\n\t\t\t\tif (t3 > 1) t3 -= 1;\n\t\t\t\tc[i] = 6 * t3 < 1\n\t\t\t\t\t? t1 + (t2 - t1) * 6 * t3\n\t\t\t\t\t: 2 * t3 < 1\n\t\t\t\t\t\t? t2\n\t\t\t\t\t\t: 3 * t3 < 2\n\t\t\t\t\t\t\t? t1 + (t2 - t1) * ((2 / 3) - t3) * 6\n\t\t\t\t\t\t\t: t1;\n\t\t\t}\n\t\t\treturn c;\n\t\t},\n\n\t\t'rgb-gray': function(r, g, b) {\n\t\t\treturn [r * 0.2989 + g * 0.587 + b * 0.114];\n\t\t},\n\n\t\t'gray-rgb': function(g) {\n\t\t\treturn [g, g, g];\n\t\t},\n\n\t\t'gray-hsb': function(g) {\n\t\t\treturn [0, 0, g];\n\t\t},\n\n\t\t'gray-hsl': function(g) {\n\t\t\treturn [0, 0, g];\n\t\t},\n\n\t\t'gradient-rgb': function() {\n\t\t\treturn [];\n\t\t},\n\n\t\t'rgb-gradient': function() {\n\t\t\treturn [];\n\t\t}\n\n\t};\n\n\treturn Base.each(types, function(properties, type) {\n\t\tcomponentParsers[type] = [];\n\t\tBase.each(properties, function(name, index) {\n\t\t\tvar part = Base.capitalize(name),\n\t\t\t\thasOverlap = /^(hue|saturation)$/.test(name),\n\t\t\t\tparser = componentParsers[type][index] = type === 'gradient'\n\t\t\t\t\t? name === 'gradient'\n\t\t\t\t\t\t? function(value) {\n\t\t\t\t\t\t\tvar current = this._components[0];\n\t\t\t\t\t\t\tvalue = Gradient.read(\n\t\t\t\t\t\t\t\tArray.isArray(value)\n\t\t\t\t\t\t\t\t\t? value\n\t\t\t\t\t\t\t\t\t: arguments, 0, { readNull: true }\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (current !== value) {\n\t\t\t\t\t\t\t\tif (current)\n\t\t\t\t\t\t\t\t\tcurrent._removeOwner(this);\n\t\t\t\t\t\t\t\tif (value)\n\t\t\t\t\t\t\t\t\tvalue._addOwner(this);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t: function() {\n\t\t\t\t\t\t\treturn Point.read(arguments, 0, {\n\t\t\t\t\t\t\t\t\treadNull: name === 'highlight',\n\t\t\t\t\t\t\t\t\tclone: true\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t: function(value) {\n\t\t\t\t\t\treturn value == null || isNaN(value) ? 0 : +value;\n\t\t\t\t\t};\n\t\t\tthis['get' + part] = function() {\n\t\t\t\treturn this._type === type\n\t\t\t\t\t|| hasOverlap && /^hs[bl]$/.test(this._type)\n\t\t\t\t\t\t? this._components[index]\n\t\t\t\t\t\t: this._convert(type)[index];\n\t\t\t};\n\n\t\t\tthis['set' + part] = function(value) {\n\t\t\t\tif (this._type !== type\n\t\t\t\t\t\t&& !(hasOverlap && /^hs[bl]$/.test(this._type))) {\n\t\t\t\t\tthis._components = this._convert(type);\n\t\t\t\t\tthis._properties = types[type];\n\t\t\t\t\tthis._type = type;\n\t\t\t\t}\n\t\t\t\tthis._components[index] = parser.call(this, value);\n\t\t\t\tthis._changed();\n\t\t\t};\n\t\t}, this);\n\t}, {\n\t\t_class: 'Color',\n\t\t_readIndex: true,\n\n\t\tinitialize: function Color(arg) {\n\t\t\tvar args = arguments,\n\t\t\t\treading = this.__read,\n\t\t\t\tread = 0,\n\t\t\t\ttype,\n\t\t\t\tcomponents,\n\t\t\t\talpha,\n\t\t\t\tvalues;\n\t\t\tif (Array.isArray(arg)) {\n\t\t\t\targs = arg;\n\t\t\t\targ = args[0];\n\t\t\t}\n\t\t\tvar argType = arg != null && typeof arg;\n\t\t\tif (argType === 'string' && arg in types) {\n\t\t\t\ttype = arg;\n\t\t\t\targ = args[1];\n\t\t\t\tif (Array.isArray(arg)) {\n\t\t\t\t\tcomponents = arg;\n\t\t\t\t\talpha = args[2];\n\t\t\t\t} else {\n\t\t\t\t\tif (reading)\n\t\t\t\t\t\tread = 1;\n\t\t\t\t\targs = Base.slice(args, 1);\n\t\t\t\t\targType = typeof arg;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!components) {\n\t\t\t\tvalues = argType === 'number'\n\t\t\t\t\t\t? args\n\t\t\t\t\t\t: argType === 'object' && arg.length != null\n\t\t\t\t\t\t\t? arg\n\t\t\t\t\t\t\t: null;\n\t\t\t\tif (values) {\n\t\t\t\t\tif (!type)\n\t\t\t\t\t\ttype = values.length >= 3\n\t\t\t\t\t\t\t\t? 'rgb'\n\t\t\t\t\t\t\t\t: 'gray';\n\t\t\t\t\tvar length = types[type].length;\n\t\t\t\t\talpha = values[length];\n\t\t\t\t\tif (reading) {\n\t\t\t\t\t\tread += values === arguments\n\t\t\t\t\t\t\t? length + (alpha != null ? 1 : 0)\n\t\t\t\t\t\t\t: 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (values.length > length)\n\t\t\t\t\t\tvalues = Base.slice(values, 0, length);\n\t\t\t\t} else if (argType === 'string') {\n\t\t\t\t\tvar converted = fromCSS(arg);\n\t\t\t\t\ttype = converted[0];\n\t\t\t\t\tcomponents = converted[1];\n\t\t\t\t\tif (components.length === 4) {\n\t\t\t\t\t\talpha = components[3];\n\t\t\t\t\t\tcomponents.length--;\n\t\t\t\t\t}\n\t\t\t\t} else if (argType === 'object') {\n\t\t\t\t\tif (arg.constructor === Color) {\n\t\t\t\t\t\ttype = arg._type;\n\t\t\t\t\t\tcomponents = arg._components.slice();\n\t\t\t\t\t\talpha = arg._alpha;\n\t\t\t\t\t\tif (type === 'gradient') {\n\t\t\t\t\t\t\tfor (var i = 1, l = components.length; i < l; i++) {\n\t\t\t\t\t\t\t\tvar point = components[i];\n\t\t\t\t\t\t\t\tif (point)\n\t\t\t\t\t\t\t\t\tcomponents[i] = point.clone();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (arg.constructor === Gradient) {\n\t\t\t\t\t\ttype = 'gradient';\n\t\t\t\t\t\tvalues = args;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttype = 'hue' in arg\n\t\t\t\t\t\t\t? 'lightness' in arg\n\t\t\t\t\t\t\t\t? 'hsl'\n\t\t\t\t\t\t\t\t: 'hsb'\n\t\t\t\t\t\t\t: 'gradient' in arg || 'stops' in arg\n\t\t\t\t\t\t\t\t\t|| 'radial' in arg\n\t\t\t\t\t\t\t\t? 'gradient'\n\t\t\t\t\t\t\t\t: 'gray' in arg\n\t\t\t\t\t\t\t\t\t? 'gray'\n\t\t\t\t\t\t\t\t\t: 'rgb';\n\t\t\t\t\t\tvar properties = types[type],\n\t\t\t\t\t\t\tparsers = componentParsers[type];\n\t\t\t\t\t\tthis._components = components = [];\n\t\t\t\t\t\tfor (var i = 0, l = properties.length; i < l; i++) {\n\t\t\t\t\t\t\tvar value = arg[properties[i]];\n\t\t\t\t\t\t\tif (value == null && !i && type === 'gradient'\n\t\t\t\t\t\t\t\t\t&& 'stops' in arg) {\n\t\t\t\t\t\t\t\tvalue = {\n\t\t\t\t\t\t\t\t\tstops: arg.stops,\n\t\t\t\t\t\t\t\t\tradial: arg.radial\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvalue = parsers[i].call(this, value);\n\t\t\t\t\t\t\tif (value != null)\n\t\t\t\t\t\t\t\tcomponents[i] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t\talpha = arg.alpha;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (reading && type)\n\t\t\t\t\tread = 1;\n\t\t\t}\n\t\t\tthis._type = type || 'rgb';\n\t\t\tif (!components) {\n\t\t\t\tthis._components = components = [];\n\t\t\t\tvar parsers = componentParsers[this._type];\n\t\t\t\tfor (var i = 0, l = parsers.length; i < l; i++) {\n\t\t\t\t\tvar value = parsers[i].call(this, values && values[i]);\n\t\t\t\t\tif (value != null)\n\t\t\t\t\t\tcomponents[i] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._components = components;\n\t\t\tthis._properties = types[this._type];\n\t\t\tthis._alpha = alpha;\n\t\t\tif (reading)\n\t\t\t\tthis.__read = read;\n\t\t\treturn this;\n\t\t},\n\n\t\tset: '#initialize',\n\n\t\t_serialize: function(options, dictionary) {\n\t\t\tvar components = this.getComponents();\n\t\t\treturn Base.serialize(\n\t\t\t\t\t/^(gray|rgb)$/.test(this._type)\n\t\t\t\t\t\t? components\n\t\t\t\t\t\t: [this._type].concat(components),\n\t\t\t\t\toptions, true, dictionary);\n\t\t},\n\n\t\t_changed: function() {\n\t\t\tthis._canvasStyle = null;\n\t\t\tif (this._owner) {\n\t\t\t\tif (this._setter) {\n\t\t\t\t\tthis._owner[this._setter](this);\n\t\t\t\t} else {\n\t\t\t\t\tthis._owner._changed(129);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_convert: function(type) {\n\t\t\tvar converter;\n\t\t\treturn this._type === type\n\t\t\t\t\t? this._components.slice()\n\t\t\t\t\t: (converter = converters[this._type + '-' + type])\n\t\t\t\t\t\t? converter.apply(this, this._components)\n\t\t\t\t\t\t: converters['rgb-' + type].apply(this,\n\t\t\t\t\t\t\tconverters[this._type + '-rgb'].apply(this,\n\t\t\t\t\t\t\t\tthis._components));\n\t\t},\n\n\t\tconvert: function(type) {\n\t\t\treturn new Color(type, this._convert(type), this._alpha);\n\t\t},\n\n\t\tgetType: function() {\n\t\t\treturn this._type;\n\t\t},\n\n\t\tsetType: function(type) {\n\t\t\tthis._components = this._convert(type);\n\t\t\tthis._properties = types[type];\n\t\t\tthis._type = type;\n\t\t},\n\n\t\tgetComponents: function() {\n\t\t\tvar components = this._components.slice();\n\t\t\tif (this._alpha != null)\n\t\t\t\tcomponents.push(this._alpha);\n\t\t\treturn components;\n\t\t},\n\n\t\tgetAlpha: function() {\n\t\t\treturn this._alpha != null ? this._alpha : 1;\n\t\t},\n\n\t\tsetAlpha: function(alpha) {\n\t\t\tthis._alpha = alpha == null ? null : Math.min(Math.max(alpha, 0), 1);\n\t\t\tthis._changed();\n\t\t},\n\n\t\thasAlpha: function() {\n\t\t\treturn this._alpha != null;\n\t\t},\n\n\t\tequals: function(color) {\n\t\t\tvar col = Base.isPlainValue(color, true)\n\t\t\t\t\t? Color.read(arguments)\n\t\t\t\t\t: color;\n\t\t\treturn col === this || col && this._class === col._class\n\t\t\t\t\t&& this._type === col._type\n\t\t\t\t\t&& this.getAlpha() === col.getAlpha()\n\t\t\t\t\t&& Base.equals(this._components, col._components)\n\t\t\t\t\t|| false;\n\t\t},\n\n\t\ttoString: function() {\n\t\t\tvar properties = this._properties,\n\t\t\t\tparts = [],\n\t\t\t\tisGradient = this._type === 'gradient',\n\t\t\t\tf = Formatter.instance;\n\t\t\tfor (var i = 0, l = properties.length; i < l; i++) {\n\t\t\t\tvar value = this._components[i];\n\t\t\t\tif (value != null)\n\t\t\t\t\tparts.push(properties[i] + ': '\n\t\t\t\t\t\t\t+ (isGradient ? value : f.number(value)));\n\t\t\t}\n\t\t\tif (this._alpha != null)\n\t\t\t\tparts.push('alpha: ' + f.number(this._alpha));\n\t\t\treturn '{ ' + parts.join(', ') + ' }';\n\t\t},\n\n\t\ttoCSS: function(hex) {\n\t\t\tvar components = this._convert('rgb'),\n\t\t\t\talpha = hex || this._alpha == null ? 1 : this._alpha;\n\t\t\tfunction convert(val) {\n\t\t\t\treturn Math.round((val < 0 ? 0 : val > 1 ? 1 : val) * 255);\n\t\t\t}\n\t\t\tcomponents = [\n\t\t\t\tconvert(components[0]),\n\t\t\t\tconvert(components[1]),\n\t\t\t\tconvert(components[2])\n\t\t\t];\n\t\t\tif (alpha < 1)\n\t\t\t\tcomponents.push(alpha < 0 ? 0 : alpha);\n\t\t\treturn hex\n\t\t\t\t\t? '#' + ((1 << 24) + (components[0] << 16)\n\t\t\t\t\t\t+ (components[1] << 8)\n\t\t\t\t\t\t+ components[2]).toString(16).slice(1)\n\t\t\t\t\t: (components.length == 4 ? 'rgba(' : 'rgb(')\n\t\t\t\t\t\t+ components.join(',') + ')';\n\t\t},\n\n\t\ttoCanvasStyle: function(ctx, matrix) {\n\t\t\tif (this._canvasStyle)\n\t\t\t\treturn this._canvasStyle;\n\t\t\tif (this._type !== 'gradient')\n\t\t\t\treturn this._canvasStyle = this.toCSS();\n\t\t\tvar components = this._components,\n\t\t\t\tgradient = components[0],\n\t\t\t\tstops = gradient._stops,\n\t\t\t\torigin = components[1],\n\t\t\t\tdestination = components[2],\n\t\t\t\thighlight = components[3],\n\t\t\t\tinverse = matrix && matrix.inverted(),\n\t\t\t\tcanvasGradient;\n\t\t\tif (inverse) {\n\t\t\t\torigin = inverse._transformPoint(origin);\n\t\t\t\tdestination = inverse._transformPoint(destination);\n\t\t\t\tif (highlight)\n\t\t\t\t\thighlight = inverse._transformPoint(highlight);\n\t\t\t}\n\t\t\tif (gradient._radial) {\n\t\t\t\tvar radius = destination.getDistance(origin);\n\t\t\t\tif (highlight) {\n\t\t\t\t\tvar vector = highlight.subtract(origin);\n\t\t\t\t\tif (vector.getLength() > radius)\n\t\t\t\t\t\thighlight = origin.add(vector.normalize(radius - 0.1));\n\t\t\t\t}\n\t\t\t\tvar start = highlight || origin;\n\t\t\t\tcanvasGradient = ctx.createRadialGradient(start.x, start.y,\n\t\t\t\t\t\t0, origin.x, origin.y, radius);\n\t\t\t} else {\n\t\t\t\tcanvasGradient = ctx.createLinearGradient(origin.x, origin.y,\n\t\t\t\t\t\tdestination.x, destination.y);\n\t\t\t}\n\t\t\tfor (var i = 0, l = stops.length; i < l; i++) {\n\t\t\t\tvar stop = stops[i],\n\t\t\t\t\toffset = stop._offset;\n\t\t\t\tcanvasGradient.addColorStop(\n\t\t\t\t\t\toffset == null ? i / (l - 1) : offset,\n\t\t\t\t\t\tstop._color.toCanvasStyle());\n\t\t\t}\n\t\t\treturn this._canvasStyle = canvasGradient;\n\t\t},\n\n\t\ttransform: function(matrix) {\n\t\t\tif (this._type === 'gradient') {\n\t\t\t\tvar components = this._components;\n\t\t\t\tfor (var i = 1, l = components.length; i < l; i++) {\n\t\t\t\t\tvar point = components[i];\n\t\t\t\t\tmatrix._transformPoint(point, point, true);\n\t\t\t\t}\n\t\t\t\tthis._changed();\n\t\t\t}\n\t\t},\n\n\t\tstatics: {\n\t\t\t_types: types,\n\n\t\t\trandom: function() {\n\t\t\t\tvar random = Math.random;\n\t\t\t\treturn new Color(random(), random(), random());\n\t\t\t},\n\n\t\t\t_setOwner: function(color, owner, setter) {\n\t\t\t\tif (color) {\n\t\t\t\t\tif (color._owner && owner && color._owner !== owner) {\n\t\t\t\t\t\tcolor = color.clone();\n\t\t\t\t\t}\n\t\t\t\t\tif (!color._owner ^ !owner) {\n\t\t\t\t\t\tcolor._owner = owner || null;\n\t\t\t\t\t\tcolor._setter = setter || null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn color;\n\t\t\t}\n\t\t}\n\t});\n},\nnew function() {\n\tvar operators = {\n\t\tadd: function(a, b) {\n\t\t\treturn a + b;\n\t\t},\n\n\t\tsubtract: function(a, b) {\n\t\t\treturn a - b;\n\t\t},\n\n\t\tmultiply: function(a, b) {\n\t\t\treturn a * b;\n\t\t},\n\n\t\tdivide: function(a, b) {\n\t\t\treturn a / b;\n\t\t}\n\t};\n\n\treturn Base.each(operators, function(operator, name) {\n\t\tthis[name] = function(color) {\n\t\t\tcolor = Color.read(arguments);\n\t\t\tvar type = this._type,\n\t\t\t\tcomponents1 = this._components,\n\t\t\t\tcomponents2 = color._convert(type);\n\t\t\tfor (var i = 0, l = components1.length; i < l; i++)\n\t\t\t\tcomponents2[i] = operator(components1[i], components2[i]);\n\t\t\treturn new Color(type, components2,\n\t\t\t\t\tthis._alpha != null\n\t\t\t\t\t\t\t? operator(this._alpha, color.getAlpha())\n\t\t\t\t\t\t\t: null);\n\t\t};\n\t}, {\n\t});\n});\n\nvar Gradient = Base.extend({\n\t_class: 'Gradient',\n\n\tinitialize: function Gradient(stops, radial) {\n\t\tthis._id = UID.get();\n\t\tif (stops && Base.isPlainObject(stops)) {\n\t\t\tthis.set(stops);\n\t\t\tstops = radial = null;\n\t\t}\n\t\tif (this._stops == null) {\n\t\t\tthis.setStops(stops || ['white', 'black']);\n\t\t}\n\t\tif (this._radial == null) {\n\t\t\tthis.setRadial(typeof radial === 'string' && radial === 'radial'\n\t\t\t\t\t|| radial || false);\n\t\t}\n\t},\n\n\t_serialize: function(options, dictionary) {\n\t\treturn dictionary.add(this, function() {\n\t\t\treturn Base.serialize([this._stops, this._radial],\n\t\t\t\t\toptions, true, dictionary);\n\t\t});\n\t},\n\n\t_changed: function() {\n\t\tfor (var i = 0, l = this._owners && this._owners.length; i < l; i++) {\n\t\t\tthis._owners[i]._changed();\n\t\t}\n\t},\n\n\t_addOwner: function(color) {\n\t\tif (!this._owners)\n\t\t\tthis._owners = [];\n\t\tthis._owners.push(color);\n\t},\n\n\t_removeOwner: function(color) {\n\t\tvar index = this._owners ? this._owners.indexOf(color) : -1;\n\t\tif (index != -1) {\n\t\t\tthis._owners.splice(index, 1);\n\t\t\tif (!this._owners.length)\n\t\t\t\tthis._owners = undefined;\n\t\t}\n\t},\n\n\tclone: function() {\n\t\tvar stops = [];\n\t\tfor (var i = 0, l = this._stops.length; i < l; i++) {\n\t\t\tstops[i] = this._stops[i].clone();\n\t\t}\n\t\treturn new Gradient(stops, this._radial);\n\t},\n\n\tgetStops: function() {\n\t\treturn this._stops;\n\t},\n\n\tsetStops: function(stops) {\n\t\tif (stops.length < 2) {\n\t\t\tthrow new Error(\n\t\t\t\t\t'Gradient stop list needs to contain at least two stops.');\n\t\t}\n\t\tvar _stops = this._stops;\n\t\tif (_stops) {\n\t\t\tfor (var i = 0, l = _stops.length; i < l; i++)\n\t\t\t\t_stops[i]._owner = undefined;\n\t\t}\n\t\t_stops = this._stops = GradientStop.readList(stops, 0, { clone: true });\n\t\tfor (var i = 0, l = _stops.length; i < l; i++)\n\t\t\t_stops[i]._owner = this;\n\t\tthis._changed();\n\t},\n\n\tgetRadial: function() {\n\t\treturn this._radial;\n\t},\n\n\tsetRadial: function(radial) {\n\t\tthis._radial = radial;\n\t\tthis._changed();\n\t},\n\n\tequals: function(gradient) {\n\t\tif (gradient === this)\n\t\t\treturn true;\n\t\tif (gradient && this._class === gradient._class) {\n\t\t\tvar stops1 = this._stops,\n\t\t\t\tstops2 = gradient._stops,\n\t\t\t\tlength = stops1.length;\n\t\t\tif (length === stops2.length) {\n\t\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\t\tif (!stops1[i].equals(stops2[i]))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n});\n\nvar GradientStop = Base.extend({\n\t_class: 'GradientStop',\n\n\tinitialize: function GradientStop(arg0, arg1) {\n\t\tvar color = arg0,\n\t\t\toffset = arg1;\n\t\tif (typeof arg0 === 'object' && arg1 === undefined) {\n\t\t\tif (Array.isArray(arg0) && typeof arg0[0] !== 'number') {\n\t\t\t\tcolor = arg0[0];\n\t\t\t\toffset = arg0[1];\n\t\t\t} else if ('color' in arg0 || 'offset' in arg0\n\t\t\t\t\t|| 'rampPoint' in arg0) {\n\t\t\t\tcolor = arg0.color;\n\t\t\t\toffset = arg0.offset || arg0.rampPoint || 0;\n\t\t\t}\n\t\t}\n\t\tthis.setColor(color);\n\t\tthis.setOffset(offset);\n\t},\n\n\tclone: function() {\n\t\treturn new GradientStop(this._color.clone(), this._offset);\n\t},\n\n\t_serialize: function(options, dictionary) {\n\t\tvar color = this._color,\n\t\t\toffset = this._offset;\n\t\treturn Base.serialize(offset == null ? [color] : [color, offset],\n\t\t\t\toptions, true, dictionary);\n\t},\n\n\t_changed: function() {\n\t\tif (this._owner)\n\t\t\tthis._owner._changed(129);\n\t},\n\n\tgetOffset: function() {\n\t\treturn this._offset;\n\t},\n\n\tsetOffset: function(offset) {\n\t\tthis._offset = offset;\n\t\tthis._changed();\n\t},\n\n\tgetRampPoint: '#getOffset',\n\tsetRampPoint: '#setOffset',\n\n\tgetColor: function() {\n\t\treturn this._color;\n\t},\n\n\tsetColor: function() {\n\t\tColor._setOwner(this._color, null);\n\t\tthis._color = Color._setOwner(Color.read(arguments, 0), this,\n\t\t\t\t'setColor');\n\t\tthis._changed();\n\t},\n\n\tequals: function(stop) {\n\t\treturn stop === this || stop && this._class === stop._class\n\t\t\t\t&& this._color.equals(stop._color)\n\t\t\t\t&& this._offset == stop._offset\n\t\t\t\t|| false;\n\t}\n});\n\nvar Style = Base.extend(new function() {\n\tvar itemDefaults = {\n\t\tfillColor: null,\n\t\tfillRule: 'nonzero',\n\t\tstrokeColor: null,\n\t\tstrokeWidth: 1,\n\t\tstrokeCap: 'butt',\n\t\tstrokeJoin: 'miter',\n\t\tstrokeScaling: true,\n\t\tmiterLimit: 10,\n\t\tdashOffset: 0,\n\t\tdashArray: [],\n\t\tshadowColor: null,\n\t\tshadowBlur: 0,\n\t\tshadowOffset: new Point(),\n\t\tselectedColor: null\n\t},\n\tgroupDefaults = Base.set({}, itemDefaults, {\n\t\tfontFamily: 'sans-serif',\n\t\tfontWeight: 'normal',\n\t\tfontSize: 12,\n\t\tleading: null,\n\t\tjustification: 'left'\n\t}),\n\ttextDefaults = Base.set({}, groupDefaults, {\n\t\tfillColor: new Color()\n\t}),\n\tflags = {\n\t\tstrokeWidth: 193,\n\t\tstrokeCap: 193,\n\t\tstrokeJoin: 193,\n\t\tstrokeScaling: 201,\n\t\tmiterLimit: 193,\n\t\tfontFamily: 9,\n\t\tfontWeight: 9,\n\t\tfontSize: 9,\n\t\tfont: 9,\n\t\tleading: 9,\n\t\tjustification: 9\n\t},\n\titem = {\n\t\tbeans: true\n\t},\n\tfields = {\n\t\t_class: 'Style',\n\t\tbeans: true,\n\n\t\tinitialize: function Style(style, _owner, _project) {\n\t\t\tthis._values = {};\n\t\t\tthis._owner = _owner;\n\t\t\tthis._project = _owner && _owner._project || _project\n\t\t\t\t\t|| paper.project;\n\t\t\tthis._defaults = !_owner || _owner instanceof Group ? groupDefaults\n\t\t\t\t\t: _owner instanceof TextItem ? textDefaults\n\t\t\t\t\t: itemDefaults;\n\t\t\tif (style)\n\t\t\t\tthis.set(style);\n\t\t}\n\t};\n\n\tBase.each(groupDefaults, function(value, key) {\n\t\tvar isColor = /Color$/.test(key),\n\t\t\tisPoint = key === 'shadowOffset',\n\t\t\tpart = Base.capitalize(key),\n\t\t\tflag = flags[key],\n\t\t\tset = 'set' + part,\n\t\t\tget = 'get' + part;\n\n\t\tfields[set] = function(value) {\n\t\t\tvar owner = this._owner,\n\t\t\t\tchildren = owner && owner._children,\n\t\t\t\tapplyToChildren = children && children.length > 0\n\t\t\t\t\t&& !(owner instanceof CompoundPath);\n\t\t\tif (applyToChildren) {\n\t\t\t\tfor (var i = 0, l = children.length; i < l; i++)\n\t\t\t\t\tchildren[i]._style[set](value);\n\t\t\t}\n\t\t\tif ((key === 'selectedColor' || !applyToChildren)\n\t\t\t\t\t&& key in this._defaults) {\n\t\t\t\tvar old = this._values[key];\n\t\t\t\tif (old !== value) {\n\t\t\t\t\tif (isColor) {\n\t\t\t\t\t\tif (old) {\n\t\t\t\t\t\t\tColor._setOwner(old, null);\n\t\t\t\t\t\t\told._canvasStyle = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (value && value.constructor === Color) {\n\t\t\t\t\t\t\tvalue = Color._setOwner(value, owner,\n\t\t\t\t\t\t\t\t\tapplyToChildren && set);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis._values[key] = value;\n\t\t\t\t\tif (owner)\n\t\t\t\t\t\towner._changed(flag || 129);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tfields[get] = function(_dontMerge) {\n\t\t\tvar owner = this._owner,\n\t\t\t\tchildren = owner && owner._children,\n\t\t\t\tapplyToChildren = children && children.length > 0\n\t\t\t\t\t&& !(owner instanceof CompoundPath),\n\t\t\t\tvalue;\n\t\t\tif (applyToChildren && !_dontMerge) {\n\t\t\t\tfor (var i = 0, l = children.length; i < l; i++) {\n\t\t\t\t\tvar childValue = children[i]._style[get]();\n\t\t\t\t\tif (!i) {\n\t\t\t\t\t\tvalue = childValue;\n\t\t\t\t\t} else if (!Base.equals(value, childValue)) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (key in this._defaults) {\n\t\t\t\tvar value = this._values[key];\n\t\t\t\tif (value === undefined) {\n\t\t\t\t\tvalue = this._defaults[key];\n\t\t\t\t\tif (value && value.clone) {\n\t\t\t\t\t\tvalue = value.clone();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tvar ctor = isColor ? Color : isPoint ? Point : null;\n\t\t\t\t\tif (ctor && !(value && value.constructor === ctor)) {\n\t\t\t\t\t\tthis._values[key] = value = ctor.read([value], 0,\n\t\t\t\t\t\t\t\t{ readNull: true, clone: true });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (value && isColor) {\n\t\t\t\tvalue = Color._setOwner(value, owner, applyToChildren && set);\n\t\t\t}\n\t\t\treturn value;\n\t\t};\n\n\t\titem[get] = function(_dontMerge) {\n\t\t\treturn this._style[get](_dontMerge);\n\t\t};\n\n\t\titem[set] = function(value) {\n\t\t\tthis._style[set](value);\n\t\t};\n\t});\n\n\tBase.each({\n\t\tFont: 'FontFamily',\n\t\tWindingRule: 'FillRule'\n\t}, function(value, key) {\n\t\tvar get = 'get' + key,\n\t\t\tset = 'set' + key;\n\t\tfields[get] = item[get] = '#get' + value;\n\t\tfields[set] = item[set] = '#set' + value;\n\t});\n\n\tItem.inject(item);\n\treturn fields;\n}, {\n\tset: function(style) {\n\t\tvar isStyle = style instanceof Style,\n\t\t\tvalues = isStyle ? style._values : style;\n\t\tif (values) {\n\t\t\tfor (var key in values) {\n\t\t\t\tif (key in this._defaults) {\n\t\t\t\t\tvar value = values[key];\n\t\t\t\t\tthis[key] = value && isStyle && value.clone\n\t\t\t\t\t\t\t? value.clone() : value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tequals: function(style) {\n\t\tfunction compare(style1, style2, secondary) {\n\t\t\tvar values1 = style1._values,\n\t\t\t\tvalues2 = style2._values,\n\t\t\t\tdefaults2 = style2._defaults;\n\t\t\tfor (var key in values1) {\n\t\t\t\tvar value1 = values1[key],\n\t\t\t\t\tvalue2 = values2[key];\n\t\t\t\tif (!(secondary && key in values2) && !Base.equals(value1,\n\t\t\t\t\t\tvalue2 === undefined ? defaults2[key] : value2))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\treturn style === this || style && this._class === style._class\n\t\t\t\t&& compare(this, style)\n\t\t\t\t&& compare(style, this, true)\n\t\t\t\t|| false;\n\t},\n\n\t_dispose: function() {\n\t\tvar color;\n\t\tcolor = this.getFillColor();\n\t\tif (color) color._canvasStyle = null;\n\t\tcolor = this.getStrokeColor();\n\t\tif (color) color._canvasStyle = null;\n\t\tcolor = this.getShadowColor();\n\t\tif (color) color._canvasStyle = null;\n\t},\n\n\thasFill: function() {\n\t\tvar color = this.getFillColor();\n\t\treturn !!color && color.alpha > 0;\n\t},\n\n\thasStroke: function() {\n\t\tvar color = this.getStrokeColor();\n\t\treturn !!color && color.alpha > 0 && this.getStrokeWidth() > 0;\n\t},\n\n\thasShadow: function() {\n\t\tvar color = this.getShadowColor();\n\t\treturn !!color && color.alpha > 0 && (this.getShadowBlur() > 0\n\t\t\t\t|| !this.getShadowOffset().isZero());\n\t},\n\n\tgetView: function() {\n\t\treturn this._project._view;\n\t},\n\n\tgetFontStyle: function() {\n\t\tvar fontSize = this.getFontSize();\n\t\treturn this.getFontWeight()\n\t\t\t\t+ ' ' + fontSize + (/[a-z]/i.test(fontSize + '') ? ' ' : 'px ')\n\t\t\t\t+ this.getFontFamily();\n\t},\n\n\tgetFont: '#getFontFamily',\n\tsetFont: '#setFontFamily',\n\n\tgetLeading: function getLeading() {\n\t\tvar leading = getLeading.base.call(this),\n\t\t\tfontSize = this.getFontSize();\n\t\tif (/pt|em|%|px/.test(fontSize))\n\t\t\tfontSize = this.getView().getPixelSize(fontSize);\n\t\treturn leading != null ? leading : fontSize * 1.2;\n\t}\n\n});\n\nvar DomElement = new function() {\n\tfunction handlePrefix(el, name, set, value) {\n\t\tvar prefixes = ['', 'webkit', 'moz', 'Moz', 'ms', 'o'],\n\t\t\tsuffix = name[0].toUpperCase() + name.substring(1);\n\t\tfor (var i = 0; i < 6; i++) {\n\t\t\tvar prefix = prefixes[i],\n\t\t\t\tkey = prefix ? prefix + suffix : name;\n\t\t\tif (key in el) {\n\t\t\t\tif (set) {\n\t\t\t\t\tel[key] = value;\n\t\t\t\t} else {\n\t\t\t\t\treturn el[key];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tgetStyles: function(el) {\n\t\t\tvar doc = el && el.nodeType !== 9 ? el.ownerDocument : el,\n\t\t\t\tview = doc && doc.defaultView;\n\t\t\treturn view && view.getComputedStyle(el, '');\n\t\t},\n\n\t\tgetBounds: function(el, viewport) {\n\t\t\tvar doc = el.ownerDocument,\n\t\t\t\tbody = doc.body,\n\t\t\t\thtml = doc.documentElement,\n\t\t\t\trect;\n\t\t\ttry {\n\t\t\t\trect = el.getBoundingClientRect();\n\t\t\t} catch (e) {\n\t\t\t\trect = { left: 0, top: 0, width: 0, height: 0 };\n\t\t\t}\n\t\t\tvar x = rect.left - (html.clientLeft || body.clientLeft || 0),\n\t\t\t\ty = rect.top - (html.clientTop || body.clientTop || 0);\n\t\t\tif (!viewport) {\n\t\t\t\tvar view = doc.defaultView;\n\t\t\t\tx += view.pageXOffset || html.scrollLeft || body.scrollLeft;\n\t\t\t\ty += view.pageYOffset || html.scrollTop || body.scrollTop;\n\t\t\t}\n\t\t\treturn new Rectangle(x, y, rect.width, rect.height);\n\t\t},\n\n\t\tgetViewportBounds: function(el) {\n\t\t\tvar doc = el.ownerDocument,\n\t\t\t\tview = doc.defaultView,\n\t\t\t\thtml = doc.documentElement;\n\t\t\treturn new Rectangle(0, 0,\n\t\t\t\tview.innerWidth || html.clientWidth,\n\t\t\t\tview.innerHeight || html.clientHeight\n\t\t\t);\n\t\t},\n\n\t\tgetOffset: function(el, viewport) {\n\t\t\treturn DomElement.getBounds(el, viewport).getPoint();\n\t\t},\n\n\t\tgetSize: function(el) {\n\t\t\treturn DomElement.getBounds(el, true).getSize();\n\t\t},\n\n\t\tisInvisible: function(el) {\n\t\t\treturn DomElement.getSize(el).equals(new Size(0, 0));\n\t\t},\n\n\t\tisInView: function(el) {\n\t\t\treturn !DomElement.isInvisible(el)\n\t\t\t\t\t&& DomElement.getViewportBounds(el).intersects(\n\t\t\t\t\t\tDomElement.getBounds(el, true));\n\t\t},\n\n\t\tisInserted: function(el) {\n\t\t\treturn document.body.contains(el);\n\t\t},\n\n\t\tgetPrefixed: function(el, name) {\n\t\t\treturn el && handlePrefix(el, name);\n\t\t},\n\n\t\tsetPrefixed: function(el, name, value) {\n\t\t\tif (typeof name === 'object') {\n\t\t\t\tfor (var key in name)\n\t\t\t\t\thandlePrefix(el, key, true, name[key]);\n\t\t\t} else {\n\t\t\t\thandlePrefix(el, name, true, value);\n\t\t\t}\n\t\t}\n\t};\n};\n\nvar DomEvent = {\n\tadd: function(el, events) {\n\t\tif (el) {\n\t\t\tfor (var type in events) {\n\t\t\t\tvar func = events[type],\n\t\t\t\t\tparts = type.split(/[\\s,]+/g);\n\t\t\t\tfor (var i = 0, l = parts.length; i < l; i++) {\n\t\t\t\t\tvar name = parts[i];\n\t\t\t\t\tvar options = (\n\t\t\t\t\t\tel === document\n\t\t\t\t\t\t&& (name === 'touchstart' || name === 'touchmove')\n\t\t\t\t\t) ? { passive: false } : false;\n\t\t\t\t\tel.addEventListener(name, func, options);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremove: function(el, events) {\n\t\tif (el) {\n\t\t\tfor (var type in events) {\n\t\t\t\tvar func = events[type],\n\t\t\t\t\tparts = type.split(/[\\s,]+/g);\n\t\t\t\tfor (var i = 0, l = parts.length; i < l; i++)\n\t\t\t\t\tel.removeEventListener(parts[i], func, false);\n\t\t\t}\n\t\t}\n\t},\n\n\tgetPoint: function(event) {\n\t\tvar pos = event.targetTouches\n\t\t\t\t? event.targetTouches.length\n\t\t\t\t\t? event.targetTouches[0]\n\t\t\t\t\t: event.changedTouches[0]\n\t\t\t\t: event;\n\t\treturn new Point(\n\t\t\tpos.pageX || pos.clientX + document.documentElement.scrollLeft,\n\t\t\tpos.pageY || pos.clientY + document.documentElement.scrollTop\n\t\t);\n\t},\n\n\tgetTarget: function(event) {\n\t\treturn event.target || event.srcElement;\n\t},\n\n\tgetRelatedTarget: function(event) {\n\t\treturn event.relatedTarget || event.toElement;\n\t},\n\n\tgetOffset: function(event, target) {\n\t\treturn DomEvent.getPoint(event).subtract(DomElement.getOffset(\n\t\t\t\ttarget || DomEvent.getTarget(event)));\n\t}\n};\n\nDomEvent.requestAnimationFrame = new function() {\n\tvar nativeRequest = DomElement.getPrefixed(window, 'requestAnimationFrame'),\n\t\trequested = false,\n\t\tcallbacks = [],\n\t\ttimer;\n\n\tfunction handleCallbacks() {\n\t\tvar functions = callbacks;\n\t\tcallbacks = [];\n\t\tfor (var i = 0, l = functions.length; i < l; i++)\n\t\t\tfunctions[i]();\n\t\trequested = nativeRequest && callbacks.length;\n\t\tif (requested)\n\t\t\tnativeRequest(handleCallbacks);\n\t}\n\n\treturn function(callback) {\n\t\tcallbacks.push(callback);\n\t\tif (nativeRequest) {\n\t\t\tif (!requested) {\n\t\t\t\tnativeRequest(handleCallbacks);\n\t\t\t\trequested = true;\n\t\t\t}\n\t\t} else if (!timer) {\n\t\t\ttimer = setInterval(handleCallbacks, 1000 / 60);\n\t\t}\n\t};\n};\n\nvar View = Base.extend(Emitter, {\n\t_class: 'View',\n\n\tinitialize: function View(project, element) {\n\n\t\tfunction getSize(name) {\n\t\t\treturn element[name] || parseInt(element.getAttribute(name), 10);\n\t\t}\n\n\t\tfunction getCanvasSize() {\n\t\t\tvar size = DomElement.getSize(element);\n\t\t\treturn size.isNaN() || size.isZero()\n\t\t\t\t\t? new Size(getSize('width'), getSize('height'))\n\t\t\t\t\t: size;\n\t\t}\n\n\t\tvar size;\n\t\tif (window && element) {\n\t\t\tthis._id = element.getAttribute('id');\n\t\t\tif (this._id == null)\n\t\t\t\telement.setAttribute('id', this._id = 'paper-view-' + View._id++);\n\t\t\tDomEvent.add(element, this._viewEvents);\n\t\t\tvar none = 'none';\n\t\t\tDomElement.setPrefixed(element.style, {\n\t\t\t\tuserDrag: none,\n\t\t\t\tuserSelect: none,\n\t\t\t\ttouchCallout: none,\n\t\t\t\tcontentZooming: none,\n\t\t\t\ttapHighlightColor: 'rgba(0,0,0,0)'\n\t\t\t});\n\n\t\t\tif (PaperScope.hasAttribute(element, 'resize')) {\n\t\t\t\tvar that = this;\n\t\t\t\tDomEvent.add(window, this._windowEvents = {\n\t\t\t\t\tresize: function() {\n\t\t\t\t\t\tthat.setViewSize(getCanvasSize());\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tsize = getCanvasSize();\n\n\t\t\tif (PaperScope.hasAttribute(element, 'stats')\n\t\t\t\t\t&& typeof Stats !== 'undefined') {\n\t\t\t\tthis._stats = new Stats();\n\t\t\t\tvar stats = this._stats.domElement,\n\t\t\t\t\tstyle = stats.style,\n\t\t\t\t\toffset = DomElement.getOffset(element);\n\t\t\t\tstyle.position = 'absolute';\n\t\t\t\tstyle.left = offset.x + 'px';\n\t\t\t\tstyle.top = offset.y + 'px';\n\t\t\t\tdocument.body.appendChild(stats);\n\t\t\t}\n\t\t} else {\n\t\t\tsize = new Size(element);\n\t\t\telement = null;\n\t\t}\n\t\tthis._project = project;\n\t\tthis._scope = project._scope;\n\t\tthis._element = element;\n\t\tif (!this._pixelRatio)\n\t\t\tthis._pixelRatio = window && window.devicePixelRatio || 1;\n\t\tthis._setElementSize(size.width, size.height);\n\t\tthis._viewSize = size;\n\t\tView._views.push(this);\n\t\tView._viewsById[this._id] = this;\n\t\t(this._matrix = new Matrix())._owner = this;\n\t\tif (!View._focused)\n\t\t\tView._focused = this;\n\t\tthis._frameItems = {};\n\t\tthis._frameItemCount = 0;\n\t\tthis._itemEvents = { native: {}, virtual: {} };\n\t\tthis._autoUpdate = !paper.agent.node;\n\t\tthis._needsUpdate = false;\n\t},\n\n\tremove: function() {\n\t\tif (!this._project)\n\t\t\treturn false;\n\t\tif (View._focused === this)\n\t\t\tView._focused = null;\n\t\tView._views.splice(View._views.indexOf(this), 1);\n\t\tdelete View._viewsById[this._id];\n\t\tvar project = this._project;\n\t\tif (project._view === this)\n\t\t\tproject._view = null;\n\t\tDomEvent.remove(this._element, this._viewEvents);\n\t\tDomEvent.remove(window, this._windowEvents);\n\t\tthis._element = this._project = null;\n\t\tthis.off('frame');\n\t\tthis._animate = false;\n\t\tthis._frameItems = {};\n\t\treturn true;\n\t},\n\n\t_events: Base.each(\n\t\tItem._itemHandlers.concat(['onResize', 'onKeyDown', 'onKeyUp']),\n\t\tfunction(name) {\n\t\t\tthis[name] = {};\n\t\t}, {\n\t\t\tonFrame: {\n\t\t\t\tinstall: function() {\n\t\t\t\t\tthis.play();\n\t\t\t\t},\n\n\t\t\t\tuninstall: function() {\n\t\t\t\t\tthis.pause();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t),\n\n\t_animate: false,\n\t_time: 0,\n\t_count: 0,\n\n\tgetAutoUpdate: function() {\n\t\treturn this._autoUpdate;\n\t},\n\n\tsetAutoUpdate: function(autoUpdate) {\n\t\tthis._autoUpdate = autoUpdate;\n\t\tif (autoUpdate)\n\t\t\tthis.requestUpdate();\n\t},\n\n\tupdate: function() {\n\t},\n\n\tdraw: function() {\n\t\tthis.update();\n\t},\n\n\trequestUpdate: function() {\n\t\tif (!this._requested) {\n\t\t\tvar that = this;\n\t\t\tDomEvent.requestAnimationFrame(function() {\n\t\t\t\tthat._requested = false;\n\t\t\t\tif (that._animate) {\n\t\t\t\t\tthat.requestUpdate();\n\t\t\t\t\tvar element = that._element;\n\t\t\t\t\tif ((!DomElement.getPrefixed(document, 'hidden')\n\t\t\t\t\t\t\t|| PaperScope.getAttribute(element, 'keepalive')\n\t\t\t\t\t\t\t\t=== 'true') && DomElement.isInView(element)) {\n\t\t\t\t\t\tthat._handleFrame();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (that._autoUpdate)\n\t\t\t\t\tthat.update();\n\t\t\t});\n\t\t\tthis._requested = true;\n\t\t}\n\t},\n\n\tplay: function() {\n\t\tthis._animate = true;\n\t\tthis.requestUpdate();\n\t},\n\n\tpause: function() {\n\t\tthis._animate = false;\n\t},\n\n\t_handleFrame: function() {\n\t\tpaper = this._scope;\n\t\tvar now = Date.now() / 1000,\n\t\t\tdelta = this._last ? now - this._last : 0;\n\t\tthis._last = now;\n\t\tthis.emit('frame', new Base({\n\t\t\tdelta: delta,\n\t\t\ttime: this._time += delta,\n\t\t\tcount: this._count++\n\t\t}));\n\t\tif (this._stats)\n\t\t\tthis._stats.update();\n\t},\n\n\t_animateItem: function(item, animate) {\n\t\tvar items = this._frameItems;\n\t\tif (animate) {\n\t\t\titems[item._id] = {\n\t\t\t\titem: item,\n\t\t\t\ttime: 0,\n\t\t\t\tcount: 0\n\t\t\t};\n\t\t\tif (++this._frameItemCount === 1)\n\t\t\t\tthis.on('frame', this._handleFrameItems);\n\t\t} else {\n\t\t\tdelete items[item._id];\n\t\t\tif (--this._frameItemCount === 0) {\n\t\t\t\tthis.off('frame', this._handleFrameItems);\n\t\t\t}\n\t\t}\n\t},\n\n\t_handleFrameItems: function(event) {\n\t\tfor (var i in this._frameItems) {\n\t\t\tvar entry = this._frameItems[i];\n\t\t\tentry.item.emit('frame', new Base(event, {\n\t\t\t\ttime: entry.time += event.delta,\n\t\t\t\tcount: entry.count++\n\t\t\t}));\n\t\t}\n\t},\n\n\t_changed: function() {\n\t\tthis._project._changed(4097);\n\t\tthis._bounds = this._decomposed = undefined;\n\t},\n\n\tgetElement: function() {\n\t\treturn this._element;\n\t},\n\n\tgetPixelRatio: function() {\n\t\treturn this._pixelRatio;\n\t},\n\n\tgetResolution: function() {\n\t\treturn this._pixelRatio * 72;\n\t},\n\n\tgetViewSize: function() {\n\t\tvar size = this._viewSize;\n\t\treturn new LinkedSize(size.width, size.height, this, 'setViewSize');\n\t},\n\n\tsetViewSize: function() {\n\t\tvar size = Size.read(arguments),\n\t\t\tdelta = size.subtract(this._viewSize);\n\t\tif (delta.isZero())\n\t\t\treturn;\n\t\tthis._setElementSize(size.width, size.height);\n\t\tthis._viewSize.set(size);\n\t\tthis._changed();\n\t\tthis.emit('resize', { size: size, delta: delta });\n\t\tif (this._autoUpdate) {\n\t\t\tthis.update();\n\t\t}\n\t},\n\n\t_setElementSize: function(width, height) {\n\t\tvar element = this._element;\n\t\tif (element) {\n\t\t\tif (element.width !== width)\n\t\t\t\telement.width = width;\n\t\t\tif (element.height !== height)\n\t\t\t\telement.height = height;\n\t\t}\n\t},\n\n\tgetBounds: function() {\n\t\tif (!this._bounds)\n\t\t\tthis._bounds = this._matrix.inverted()._transformBounds(\n\t\t\t\t\tnew Rectangle(new Point(), this._viewSize));\n\t\treturn this._bounds;\n\t},\n\n\tgetSize: function() {\n\t\treturn this.getBounds().getSize();\n\t},\n\n\tisVisible: function() {\n\t\treturn DomElement.isInView(this._element);\n\t},\n\n\tisInserted: function() {\n\t\treturn DomElement.isInserted(this._element);\n\t},\n\n\tgetPixelSize: function(size) {\n\t\tvar element = this._element,\n\t\t\tpixels;\n\t\tif (element) {\n\t\t\tvar parent = element.parentNode,\n\t\t\t\ttemp = document.createElement('div');\n\t\t\ttemp.style.fontSize = size;\n\t\t\tparent.appendChild(temp);\n\t\t\tpixels = parseFloat(DomElement.getStyles(temp).fontSize);\n\t\t\tparent.removeChild(temp);\n\t\t} else {\n\t\t\tpixels = parseFloat(pixels);\n\t\t}\n\t\treturn pixels;\n\t},\n\n\tgetTextWidth: function(font, lines) {\n\t\treturn 0;\n\t}\n}, Base.each(['rotate', 'scale', 'shear', 'skew'], function(key) {\n\tvar rotate = key === 'rotate';\n\tthis[key] = function() {\n\t\tvar args = arguments,\n\t\t\tvalue = (rotate ? Base : Point).read(args),\n\t\t\tcenter = Point.read(args, 0, { readNull: true });\n\t\treturn this.transform(new Matrix()[key](value,\n\t\t\t\tcenter || this.getCenter(true)));\n\t};\n}, {\n\t_decompose: function() {\n\t\treturn this._decomposed || (this._decomposed = this._matrix.decompose());\n\t},\n\n\ttranslate: function() {\n\t\tvar mx = new Matrix();\n\t\treturn this.transform(mx.translate.apply(mx, arguments));\n\t},\n\n\tgetCenter: function() {\n\t\treturn this.getBounds().getCenter();\n\t},\n\n\tsetCenter: function() {\n\t\tvar center = Point.read(arguments);\n\t\tthis.translate(this.getCenter().subtract(center));\n\t},\n\n\tgetZoom: function() {\n\t\tvar scaling = this._decompose().scaling;\n\t\treturn (scaling.x + scaling.y) / 2;\n\t},\n\n\tsetZoom: function(zoom) {\n\t\tthis.transform(new Matrix().scale(zoom / this.getZoom(),\n\t\t\tthis.getCenter()));\n\t},\n\n\tgetRotation: function() {\n\t\treturn this._decompose().rotation;\n\t},\n\n\tsetRotation: function(rotation) {\n\t\tvar current = this.getRotation();\n\t\tif (current != null && rotation != null) {\n\t\t\tthis.rotate(rotation - current);\n\t\t}\n\t},\n\n\tgetScaling: function() {\n\t\tvar scaling = this._decompose().scaling;\n\t\treturn new LinkedPoint(scaling.x, scaling.y, this, 'setScaling');\n\t},\n\n\tsetScaling: function() {\n\t\tvar current = this.getScaling(),\n\t\t\tscaling = Point.read(arguments, 0, { clone: true, readNull: true });\n\t\tif (current && scaling) {\n\t\t\tthis.scale(scaling.x / current.x, scaling.y / current.y);\n\t\t}\n\t},\n\n\tgetMatrix: function() {\n\t\treturn this._matrix;\n\t},\n\n\tsetMatrix: function() {\n\t\tvar matrix = this._matrix;\n\t\tmatrix.set.apply(matrix, arguments);\n\t},\n\n\ttransform: function(matrix) {\n\t\tthis._matrix.append(matrix);\n\t},\n\n\tscrollBy: function() {\n\t\tthis.translate(Point.read(arguments).negate());\n\t}\n}), {\n\n\tprojectToView: function() {\n\t\treturn this._matrix._transformPoint(Point.read(arguments));\n\t},\n\n\tviewToProject: function() {\n\t\treturn this._matrix._inverseTransform(Point.read(arguments));\n\t},\n\n\tgetEventPoint: function(event) {\n\t\treturn this.viewToProject(DomEvent.getOffset(event, this._element));\n\t},\n\n}, {\n\tstatics: {\n\t\t_views: [],\n\t\t_viewsById: {},\n\t\t_id: 0,\n\n\t\tcreate: function(project, element) {\n\t\t\tif (document && typeof element === 'string')\n\t\t\t\telement = document.getElementById(element);\n\t\t\tvar ctor = window ? CanvasView : View;\n\t\t\treturn new ctor(project, element);\n\t\t}\n\t}\n},\nnew function() {\n\tif (!window)\n\t\treturn;\n\tvar prevFocus,\n\t\ttempFocus,\n\t\tdragging = false,\n\t\tmouseDown = false;\n\n\tfunction getView(event) {\n\t\tvar target = DomEvent.getTarget(event);\n\t\treturn target.getAttribute && View._viewsById[\n\t\t\t\ttarget.getAttribute('id')];\n\t}\n\n\tfunction updateFocus() {\n\t\tvar view = View._focused;\n\t\tif (!view || !view.isVisible()) {\n\t\t\tfor (var i = 0, l = View._views.length; i < l; i++) {\n\t\t\t\tif ((view = View._views[i]).isVisible()) {\n\t\t\t\t\tView._focused = tempFocus = view;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction handleMouseMove(view, event, point) {\n\t\tview._handleMouseEvent('mousemove', event, point);\n\t}\n\n\tvar navigator = window.navigator,\n\t\tmousedown, mousemove, mouseup;\n\tif (navigator.pointerEnabled || navigator.msPointerEnabled) {\n\t\tmousedown = 'pointerdown MSPointerDown';\n\t\tmousemove = 'pointermove MSPointerMove';\n\t\tmouseup = 'pointerup pointercancel MSPointerUp MSPointerCancel';\n\t} else {\n\t\tmousedown = 'touchstart';\n\t\tmousemove = 'touchmove';\n\t\tmouseup = 'touchend touchcancel';\n\t\tif (!('ontouchstart' in window && navigator.userAgent.match(\n\t\t\t\t/mobile|tablet|ip(ad|hone|od)|android|silk/i))) {\n\t\t\tmousedown += ' mousedown';\n\t\t\tmousemove += ' mousemove';\n\t\t\tmouseup += ' mouseup';\n\t\t}\n\t}\n\n\tvar viewEvents = {},\n\t\tdocEvents = {\n\t\t\tmouseout: function(event) {\n\t\t\t\tvar view = View._focused,\n\t\t\t\t\ttarget = DomEvent.getRelatedTarget(event);\n\t\t\t\tif (view && (!target || target.nodeName === 'HTML')) {\n\t\t\t\t\tvar offset = DomEvent.getOffset(event, view._element),\n\t\t\t\t\t\tx = offset.x,\n\t\t\t\t\t\tabs = Math.abs,\n\t\t\t\t\t\tax = abs(x),\n\t\t\t\t\t\tmax = 1 << 25,\n\t\t\t\t\t\tdiff = ax - max;\n\t\t\t\t\toffset.x = abs(diff) < ax ? diff * (x < 0 ? -1 : 1) : x;\n\t\t\t\t\thandleMouseMove(view, event, view.viewToProject(offset));\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tscroll: updateFocus\n\t\t};\n\n\tviewEvents[mousedown] = function(event) {\n\t\tvar view = View._focused = getView(event);\n\t\tif (!dragging) {\n\t\t\tdragging = true;\n\t\t\tview._handleMouseEvent('mousedown', event);\n\t\t}\n\t};\n\n\tdocEvents[mousemove] = function(event) {\n\t\tvar view = View._focused;\n\t\tif (!mouseDown) {\n\t\t\tvar target = getView(event);\n\t\t\tif (target) {\n\t\t\t\tif (view !== target) {\n\t\t\t\t\tif (view)\n\t\t\t\t\t\thandleMouseMove(view, event);\n\t\t\t\t\tif (!prevFocus)\n\t\t\t\t\t\tprevFocus = view;\n\t\t\t\t\tview = View._focused = tempFocus = target;\n\t\t\t\t}\n\t\t\t} else if (tempFocus && tempFocus === view) {\n\t\t\t\tif (prevFocus && !prevFocus.isInserted())\n\t\t\t\t\tprevFocus = null;\n\t\t\t\tview = View._focused = prevFocus;\n\t\t\t\tprevFocus = null;\n\t\t\t\tupdateFocus();\n\t\t\t}\n\t\t}\n\t\tif (view)\n\t\t\thandleMouseMove(view, event);\n\t};\n\n\tdocEvents[mousedown] = function() {\n\t\tmouseDown = true;\n\t};\n\n\tdocEvents[mouseup] = function(event) {\n\t\tvar view = View._focused;\n\t\tif (view && dragging)\n\t\t\tview._handleMouseEvent('mouseup', event);\n\t\tmouseDown = dragging = false;\n\t};\n\n\tDomEvent.add(document, docEvents);\n\n\tDomEvent.add(window, {\n\t\tload: updateFocus\n\t});\n\n\tvar called = false,\n\t\tprevented = false,\n\t\tfallbacks = {\n\t\t\tdoubleclick: 'click',\n\t\t\tmousedrag: 'mousemove'\n\t\t},\n\t\twasInView = false,\n\t\toverView,\n\t\tdownPoint,\n\t\tlastPoint,\n\t\tdownItem,\n\t\toverItem,\n\t\tdragItem,\n\t\tclickItem,\n\t\tclickTime,\n\t\tdblClick;\n\n\tfunction emitMouseEvent(obj, target, type, event, point, prevPoint,\n\t\t\tstopItem) {\n\t\tvar stopped = false,\n\t\t\tmouseEvent;\n\n\t\tfunction emit(obj, type) {\n\t\t\tif (obj.responds(type)) {\n\t\t\t\tif (!mouseEvent) {\n\t\t\t\t\tmouseEvent = new MouseEvent(type, event, point,\n\t\t\t\t\t\t\ttarget || obj,\n\t\t\t\t\t\t\tprevPoint ? point.subtract(prevPoint) : null);\n\t\t\t\t}\n\t\t\t\tif (obj.emit(type, mouseEvent)) {\n\t\t\t\t\tcalled = true;\n\t\t\t\t\tif (mouseEvent.prevented)\n\t\t\t\t\t\tprevented = true;\n\t\t\t\t\tif (mouseEvent.stopped)\n\t\t\t\t\t\treturn stopped = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar fallback = fallbacks[type];\n\t\t\t\tif (fallback)\n\t\t\t\t\treturn emit(obj, fallback);\n\t\t\t}\n\t\t}\n\n\t\twhile (obj && obj !== stopItem) {\n\t\t\tif (emit(obj, type))\n\t\t\t\tbreak;\n\t\t\tobj = obj._parent;\n\t\t}\n\t\treturn stopped;\n\t}\n\n\tfunction emitMouseEvents(view, hitItem, type, event, point, prevPoint) {\n\t\tview._project.removeOn(type);\n\t\tprevented = called = false;\n\t\treturn (dragItem && emitMouseEvent(dragItem, null, type, event,\n\t\t\t\t\tpoint, prevPoint)\n\t\t\t|| hitItem && hitItem !== dragItem\n\t\t\t\t&& !hitItem.isDescendant(dragItem)\n\t\t\t\t&& emitMouseEvent(hitItem, null, type === 'mousedrag' ?\n\t\t\t\t\t'mousemove' : type, event, point, prevPoint, dragItem)\n\t\t\t|| emitMouseEvent(view, dragItem || hitItem || view, type, event,\n\t\t\t\t\tpoint, prevPoint));\n\t}\n\n\tvar itemEventsMap = {\n\t\tmousedown: {\n\t\t\tmousedown: 1,\n\t\t\tmousedrag: 1,\n\t\t\tclick: 1,\n\t\t\tdoubleclick: 1\n\t\t},\n\t\tmouseup: {\n\t\t\tmouseup: 1,\n\t\t\tmousedrag: 1,\n\t\t\tclick: 1,\n\t\t\tdoubleclick: 1\n\t\t},\n\t\tmousemove: {\n\t\t\tmousedrag: 1,\n\t\t\tmousemove: 1,\n\t\t\tmouseenter: 1,\n\t\t\tmouseleave: 1\n\t\t}\n\t};\n\n\treturn {\n\t\t_viewEvents: viewEvents,\n\n\t\t_handleMouseEvent: function(type, event, point) {\n\t\t\tvar itemEvents = this._itemEvents,\n\t\t\t\thitItems = itemEvents.native[type],\n\t\t\t\tnativeMove = type === 'mousemove',\n\t\t\t\ttool = this._scope.tool,\n\t\t\t\tview = this;\n\n\t\t\tfunction responds(type) {\n\t\t\t\treturn itemEvents.virtual[type] || view.responds(type)\n\t\t\t\t\t\t|| tool && tool.responds(type);\n\t\t\t}\n\n\t\t\tif (nativeMove && dragging && responds('mousedrag'))\n\t\t\t\ttype = 'mousedrag';\n\t\t\tif (!point)\n\t\t\t\tpoint = this.getEventPoint(event);\n\n\t\t\tvar inView = this.getBounds().contains(point),\n\t\t\t\thit = hitItems && inView && view._project.hitTest(point, {\n\t\t\t\t\ttolerance: 0,\n\t\t\t\t\tfill: true,\n\t\t\t\t\tstroke: true\n\t\t\t\t}),\n\t\t\t\thitItem = hit && hit.item || null,\n\t\t\t\thandle = false,\n\t\t\t\tmouse = {};\n\t\t\tmouse[type.substr(5)] = true;\n\n\t\t\tif (hitItems && hitItem !== overItem) {\n\t\t\t\tif (overItem) {\n\t\t\t\t\temitMouseEvent(overItem, null, 'mouseleave', event, point);\n\t\t\t\t}\n\t\t\t\tif (hitItem) {\n\t\t\t\t\temitMouseEvent(hitItem, null, 'mouseenter', event, point);\n\t\t\t\t}\n\t\t\t\toverItem = hitItem;\n\t\t\t}\n\t\t\tif (wasInView ^ inView) {\n\t\t\t\temitMouseEvent(this, null, inView ? 'mouseenter' : 'mouseleave',\n\t\t\t\t\t\tevent, point);\n\t\t\t\toverView = inView ? this : null;\n\t\t\t\thandle = true;\n\t\t\t}\n\t\t\tif ((inView || mouse.drag) && !point.equals(lastPoint)) {\n\t\t\t\temitMouseEvents(this, hitItem, nativeMove ? type : 'mousemove',\n\t\t\t\t\t\tevent, point, lastPoint);\n\t\t\t\thandle = true;\n\t\t\t}\n\t\t\twasInView = inView;\n\t\t\tif (mouse.down && inView || mouse.up && downPoint) {\n\t\t\t\temitMouseEvents(this, hitItem, type, event, point, downPoint);\n\t\t\t\tif (mouse.down) {\n\t\t\t\t\tdblClick = hitItem === clickItem\n\t\t\t\t\t\t&& (Date.now() - clickTime < 300);\n\t\t\t\t\tdownItem = clickItem = hitItem;\n\t\t\t\t\tif (!prevented && hitItem) {\n\t\t\t\t\t\tvar item = hitItem;\n\t\t\t\t\t\twhile (item && !item.responds('mousedrag'))\n\t\t\t\t\t\t\titem = item._parent;\n\t\t\t\t\t\tif (item)\n\t\t\t\t\t\t\tdragItem = hitItem;\n\t\t\t\t\t}\n\t\t\t\t\tdownPoint = point;\n\t\t\t\t} else if (mouse.up) {\n\t\t\t\t\tif (!prevented && hitItem === downItem) {\n\t\t\t\t\t\tclickTime = Date.now();\n\t\t\t\t\t\temitMouseEvents(this, hitItem, dblClick ? 'doubleclick'\n\t\t\t\t\t\t\t\t: 'click', event, point, downPoint);\n\t\t\t\t\t\tdblClick = false;\n\t\t\t\t\t}\n\t\t\t\t\tdownItem = dragItem = null;\n\t\t\t\t}\n\t\t\t\twasInView = false;\n\t\t\t\thandle = true;\n\t\t\t}\n\t\t\tlastPoint = point;\n\t\t\tif (handle && tool) {\n\t\t\t\tcalled = tool._handleMouseEvent(type, event, point, mouse)\n\t\t\t\t\t|| called;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tevent.cancelable !== false\n\t\t\t\t&& (called && !mouse.move || mouse.down && responds('mouseup'))\n\t\t\t) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t},\n\n\t\t_handleKeyEvent: function(type, event, key, character) {\n\t\t\tvar scope = this._scope,\n\t\t\t\ttool = scope.tool,\n\t\t\t\tkeyEvent;\n\n\t\t\tfunction emit(obj) {\n\t\t\t\tif (obj.responds(type)) {\n\t\t\t\t\tpaper = scope;\n\t\t\t\t\tobj.emit(type, keyEvent = keyEvent\n\t\t\t\t\t\t\t|| new KeyEvent(type, event, key, character));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isVisible()) {\n\t\t\t\temit(this);\n\t\t\t\tif (tool && tool.responds(type))\n\t\t\t\t\temit(tool);\n\t\t\t}\n\t\t},\n\n\t\t_countItemEvent: function(type, sign) {\n\t\t\tvar itemEvents = this._itemEvents,\n\t\t\t\tnative = itemEvents.native,\n\t\t\t\tvirtual = itemEvents.virtual;\n\t\t\tfor (var key in itemEventsMap) {\n\t\t\t\tnative[key] = (native[key] || 0)\n\t\t\t\t\t\t+ (itemEventsMap[key][type] || 0) * sign;\n\t\t\t}\n\t\t\tvirtual[type] = (virtual[type] || 0) + sign;\n\t\t},\n\n\t\tstatics: {\n\t\t\tupdateFocus: updateFocus,\n\n\t\t\t_resetState: function() {\n\t\t\t\tdragging = mouseDown = called = wasInView = false;\n\t\t\t\tprevFocus = tempFocus = overView = downPoint = lastPoint =\n\t\t\t\t\tdownItem = overItem = dragItem = clickItem = clickTime =\n\t\t\t\t\tdblClick = null;\n\t\t\t}\n\t\t}\n\t};\n});\n\nvar CanvasView = View.extend({\n\t_class: 'CanvasView',\n\n\tinitialize: function CanvasView(project, canvas) {\n\t\tif (!(canvas instanceof window.HTMLCanvasElement)) {\n\t\t\tvar size = Size.read(arguments, 1);\n\t\t\tif (size.isZero())\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'Cannot create CanvasView with the provided argument: '\n\t\t\t\t\t\t+ Base.slice(arguments, 1));\n\t\t\tcanvas = CanvasProvider.getCanvas(size);\n\t\t}\n\t\tvar ctx = this._context = canvas.getContext('2d');\n\t\tctx.save();\n\t\tthis._pixelRatio = 1;\n\t\tif (!/^off|false$/.test(PaperScope.getAttribute(canvas, 'hidpi'))) {\n\t\t\tvar deviceRatio = window.devicePixelRatio || 1,\n\t\t\t\tbackingStoreRatio = DomElement.getPrefixed(ctx,\n\t\t\t\t\t\t'backingStorePixelRatio') || 1;\n\t\t\tthis._pixelRatio = deviceRatio / backingStoreRatio;\n\t\t}\n\t\tView.call(this, project, canvas);\n\t\tthis._needsUpdate = true;\n\t},\n\n\tremove: function remove() {\n\t\tthis._context.restore();\n\t\treturn remove.base.call(this);\n\t},\n\n\t_setElementSize: function _setElementSize(width, height) {\n\t\tvar pixelRatio = this._pixelRatio;\n\t\t_setElementSize.base.call(this, width * pixelRatio, height * pixelRatio);\n\t\tif (pixelRatio !== 1) {\n\t\t\tvar element = this._element,\n\t\t\t\tctx = this._context;\n\t\t\tif (!PaperScope.hasAttribute(element, 'resize')) {\n\t\t\t\tvar style = element.style;\n\t\t\t\tstyle.width = width + 'px';\n\t\t\t\tstyle.height = height + 'px';\n\t\t\t}\n\t\t\tctx.restore();\n\t\t\tctx.save();\n\t\t\tctx.scale(pixelRatio, pixelRatio);\n\t\t}\n\t},\n\n\tgetContext: function() {\n\t\treturn this._context;\n\t},\n\n\tgetPixelSize: function getPixelSize(size) {\n\t\tvar agent = paper.agent,\n\t\t\tpixels;\n\t\tif (agent && agent.firefox) {\n\t\t\tpixels = getPixelSize.base.call(this, size);\n\t\t} else {\n\t\t\tvar ctx = this._context,\n\t\t\t\tprevFont = ctx.font;\n\t\t\tctx.font = size + ' serif';\n\t\t\tpixels = parseFloat(ctx.font);\n\t\t\tctx.font = prevFont;\n\t\t}\n\t\treturn pixels;\n\t},\n\n\tgetTextWidth: function(font, lines) {\n\t\tvar ctx = this._context,\n\t\t\tprevFont = ctx.font,\n\t\t\twidth = 0;\n\t\tctx.font = font;\n\t\tfor (var i = 0, l = lines.length; i < l; i++)\n\t\t\twidth = Math.max(width, ctx.measureText(lines[i]).width);\n\t\tctx.font = prevFont;\n\t\treturn width;\n\t},\n\n\tupdate: function() {\n\t\tif (!this._needsUpdate)\n\t\t\treturn false;\n\t\tvar project = this._project,\n\t\t\tctx = this._context,\n\t\t\tsize = this._viewSize;\n\t\tctx.clearRect(0, 0, size.width + 1, size.height + 1);\n\t\tif (project)\n\t\t\tproject.draw(ctx, this._matrix, this._pixelRatio);\n\t\tthis._needsUpdate = false;\n\t\treturn true;\n\t}\n});\n\nvar Event = Base.extend({\n\t_class: 'Event',\n\n\tinitialize: function Event(event) {\n\t\tthis.event = event;\n\t\tthis.type = event && event.type;\n\t},\n\n\tprevented: false,\n\tstopped: false,\n\n\tpreventDefault: function() {\n\t\tthis.prevented = true;\n\t\tthis.event.preventDefault();\n\t},\n\n\tstopPropagation: function() {\n\t\tthis.stopped = true;\n\t\tthis.event.stopPropagation();\n\t},\n\n\tstop: function() {\n\t\tthis.stopPropagation();\n\t\tthis.preventDefault();\n\t},\n\n\tgetTimeStamp: function() {\n\t\treturn this.event.timeStamp;\n\t},\n\n\tgetModifiers: function() {\n\t\treturn Key.modifiers;\n\t}\n});\n\nvar KeyEvent = Event.extend({\n\t_class: 'KeyEvent',\n\n\tinitialize: function KeyEvent(type, event, key, character) {\n\t\tthis.type = type;\n\t\tthis.event = event;\n\t\tthis.key = key;\n\t\tthis.character = character;\n\t},\n\n\ttoString: function() {\n\t\treturn \"{ type: '\" + this.type\n\t\t\t\t+ \"', key: '\" + this.key\n\t\t\t\t+ \"', character: '\" + this.character\n\t\t\t\t+ \"', modifiers: \" + this.getModifiers()\n\t\t\t\t+ \" }\";\n\t}\n});\n\nvar Key = new function() {\n\tvar keyLookup = {\n\t\t\t'\\t': 'tab',\n\t\t\t' ': 'space',\n\t\t\t'\\b': 'backspace',\n\t\t\t'\\x7f': 'delete',\n\t\t\t'Spacebar': 'space',\n\t\t\t'Del': 'delete',\n\t\t\t'Win': 'meta',\n\t\t\t'Esc': 'escape'\n\t\t},\n\n\t\tcharLookup = {\n\t\t\t'tab': '\\t',\n\t\t\t'space': ' ',\n\t\t\t'enter': '\\r'\n\t\t},\n\n\t\tkeyMap = {},\n\t\tcharMap = {},\n\t\tmetaFixMap,\n\t\tdownKey,\n\n\t\tmodifiers = new Base({\n\t\t\tshift: false,\n\t\t\tcontrol: false,\n\t\t\talt: false,\n\t\t\tmeta: false,\n\t\t\tcapsLock: false,\n\t\t\tspace: false\n\t\t}).inject({\n\t\t\toption: {\n\t\t\t\tget: function() {\n\t\t\t\t\treturn this.alt;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tcommand: {\n\t\t\t\tget: function() {\n\t\t\t\t\tvar agent = paper && paper.agent;\n\t\t\t\t\treturn agent && agent.mac ? this.meta : this.control;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\tfunction getKey(event) {\n\t\tvar key = event.key || event.keyIdentifier;\n\t\tkey = /^U\\+/.test(key)\n\t\t\t\t? String.fromCharCode(parseInt(key.substr(2), 16))\n\t\t\t\t: /^Arrow[A-Z]/.test(key) ? key.substr(5)\n\t\t\t\t: key === 'Unidentified' || key === undefined\n\t\t\t\t\t? String.fromCharCode(event.keyCode)\n\t\t\t\t\t: key;\n\t\treturn keyLookup[key] ||\n\t\t\t\t(key.length > 1 ? Base.hyphenate(key) : key.toLowerCase());\n\t}\n\n\tfunction handleKey(down, key, character, event) {\n\t\tvar type = down ? 'keydown' : 'keyup',\n\t\t\tview = View._focused,\n\t\t\tname;\n\t\tkeyMap[key] = down;\n\t\tif (down) {\n\t\t\tcharMap[key] = character;\n\t\t} else {\n\t\t\tdelete charMap[key];\n\t\t}\n\t\tif (key.length > 1 && (name = Base.camelize(key)) in modifiers) {\n\t\t\tmodifiers[name] = down;\n\t\t\tvar agent = paper && paper.agent;\n\t\t\tif (name === 'meta' && agent && agent.mac) {\n\t\t\t\tif (down) {\n\t\t\t\t\tmetaFixMap = {};\n\t\t\t\t} else {\n\t\t\t\t\tfor (var k in metaFixMap) {\n\t\t\t\t\t\tif (k in charMap)\n\t\t\t\t\t\t\thandleKey(false, k, metaFixMap[k], event);\n\t\t\t\t\t}\n\t\t\t\t\tmetaFixMap = null;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (down && metaFixMap) {\n\t\t\tmetaFixMap[key] = character;\n\t\t}\n\t\tif (view) {\n\t\t\tview._handleKeyEvent(down ? 'keydown' : 'keyup', event, key,\n\t\t\t\t\tcharacter);\n\t\t}\n\t}\n\n\tDomEvent.add(document, {\n\t\tkeydown: function(event) {\n\t\t\tvar key = getKey(event),\n\t\t\t\tagent = paper && paper.agent;\n\t\t\tif (key.length > 1 || agent && (agent.chrome && (event.altKey\n\t\t\t\t\t\t|| agent.mac && event.metaKey\n\t\t\t\t\t\t|| !agent.mac && event.ctrlKey))) {\n\t\t\t\thandleKey(true, key,\n\t\t\t\t\t\tcharLookup[key] || (key.length > 1 ? '' : key), event);\n\t\t\t} else {\n\t\t\t\tdownKey = key;\n\t\t\t}\n\t\t},\n\n\t\tkeypress: function(event) {\n\t\t\tif (downKey) {\n\t\t\t\tvar key = getKey(event),\n\t\t\t\t\tcode = event.charCode,\n\t\t\t\t\tcharacter = code >= 32 ? String.fromCharCode(code)\n\t\t\t\t\t\t: key.length > 1 ? '' : key;\n\t\t\t\tif (key !== downKey) {\n\t\t\t\t\tkey = character.toLowerCase();\n\t\t\t\t}\n\t\t\t\thandleKey(true, key, character, event);\n\t\t\t\tdownKey = null;\n\t\t\t}\n\t\t},\n\n\t\tkeyup: function(event) {\n\t\t\tvar key = getKey(event);\n\t\t\tif (key in charMap)\n\t\t\t\thandleKey(false, key, charMap[key], event);\n\t\t}\n\t});\n\n\tDomEvent.add(window, {\n\t\tblur: function(event) {\n\t\t\tfor (var key in charMap)\n\t\t\t\thandleKey(false, key, charMap[key], event);\n\t\t}\n\t});\n\n\treturn {\n\t\tmodifiers: modifiers,\n\n\t\tisDown: function(key) {\n\t\t\treturn !!keyMap[key];\n\t\t}\n\t};\n};\n\nvar MouseEvent = Event.extend({\n\t_class: 'MouseEvent',\n\n\tinitialize: function MouseEvent(type, event, point, target, delta) {\n\t\tthis.type = type;\n\t\tthis.event = event;\n\t\tthis.point = point;\n\t\tthis.target = target;\n\t\tthis.delta = delta;\n\t},\n\n\ttoString: function() {\n\t\treturn \"{ type: '\" + this.type\n\t\t\t\t+ \"', point: \" + this.point\n\t\t\t\t+ ', target: ' + this.target\n\t\t\t\t+ (this.delta ? ', delta: ' + this.delta : '')\n\t\t\t\t+ ', modifiers: ' + this.getModifiers()\n\t\t\t\t+ ' }';\n\t}\n});\n\nvar ToolEvent = Event.extend({\n\t_class: 'ToolEvent',\n\t_item: null,\n\n\tinitialize: function ToolEvent(tool, type, event) {\n\t\tthis.tool = tool;\n\t\tthis.type = type;\n\t\tthis.event = event;\n\t},\n\n\t_choosePoint: function(point, toolPoint) {\n\t\treturn point ? point : toolPoint ? toolPoint.clone() : null;\n\t},\n\n\tgetPoint: function() {\n\t\treturn this._choosePoint(this._point, this.tool._point);\n\t},\n\n\tsetPoint: function(point) {\n\t\tthis._point = point;\n\t},\n\n\tgetLastPoint: function() {\n\t\treturn this._choosePoint(this._lastPoint, this.tool._lastPoint);\n\t},\n\n\tsetLastPoint: function(lastPoint) {\n\t\tthis._lastPoint = lastPoint;\n\t},\n\n\tgetDownPoint: function() {\n\t\treturn this._choosePoint(this._downPoint, this.tool._downPoint);\n\t},\n\n\tsetDownPoint: function(downPoint) {\n\t\tthis._downPoint = downPoint;\n\t},\n\n\tgetMiddlePoint: function() {\n\t\tif (!this._middlePoint && this.tool._lastPoint) {\n\t\t\treturn this.tool._point.add(this.tool._lastPoint).divide(2);\n\t\t}\n\t\treturn this._middlePoint;\n\t},\n\n\tsetMiddlePoint: function(middlePoint) {\n\t\tthis._middlePoint = middlePoint;\n\t},\n\n\tgetDelta: function() {\n\t\treturn !this._delta && this.tool._lastPoint\n\t\t\t\t? this.tool._point.subtract(this.tool._lastPoint)\n\t\t\t\t: this._delta;\n\t},\n\n\tsetDelta: function(delta) {\n\t\tthis._delta = delta;\n\t},\n\n\tgetCount: function() {\n\t\treturn this.tool[/^mouse(down|up)$/.test(this.type)\n\t\t\t\t? '_downCount' : '_moveCount'];\n\t},\n\n\tsetCount: function(count) {\n\t\tthis.tool[/^mouse(down|up)$/.test(this.type) ? 'downCount' : 'count']\n\t\t\t= count;\n\t},\n\n\tgetItem: function() {\n\t\tif (!this._item) {\n\t\t\tvar result = this.tool._scope.project.hitTest(this.getPoint());\n\t\t\tif (result) {\n\t\t\t\tvar item = result.item,\n\t\t\t\t\tparent = item._parent;\n\t\t\t\twhile (/^(Group|CompoundPath)$/.test(parent._class)) {\n\t\t\t\t\titem = parent;\n\t\t\t\t\tparent = parent._parent;\n\t\t\t\t}\n\t\t\t\tthis._item = item;\n\t\t\t}\n\t\t}\n\t\treturn this._item;\n\t},\n\n\tsetItem: function(item) {\n\t\tthis._item = item;\n\t},\n\n\ttoString: function() {\n\t\treturn '{ type: ' + this.type\n\t\t\t\t+ ', point: ' + this.getPoint()\n\t\t\t\t+ ', count: ' + this.getCount()\n\t\t\t\t+ ', modifiers: ' + this.getModifiers()\n\t\t\t\t+ ' }';\n\t}\n});\n\nvar Tool = PaperScopeItem.extend({\n\t_class: 'Tool',\n\t_list: 'tools',\n\t_reference: 'tool',\n\t_events: ['onMouseDown', 'onMouseUp', 'onMouseDrag', 'onMouseMove',\n\t\t\t'onActivate', 'onDeactivate', 'onEditOptions', 'onKeyDown',\n\t\t\t'onKeyUp'],\n\n\tinitialize: function Tool(props) {\n\t\tPaperScopeItem.call(this);\n\t\tthis._moveCount = -1;\n\t\tthis._downCount = -1;\n\t\tthis.set(props);\n\t},\n\n\tgetMinDistance: function() {\n\t\treturn this._minDistance;\n\t},\n\n\tsetMinDistance: function(minDistance) {\n\t\tthis._minDistance = minDistance;\n\t\tif (minDistance != null && this._maxDistance != null\n\t\t\t\t&& minDistance > this._maxDistance) {\n\t\t\tthis._maxDistance = minDistance;\n\t\t}\n\t},\n\n\tgetMaxDistance: function() {\n\t\treturn this._maxDistance;\n\t},\n\n\tsetMaxDistance: function(maxDistance) {\n\t\tthis._maxDistance = maxDistance;\n\t\tif (this._minDistance != null && maxDistance != null\n\t\t\t\t&& maxDistance < this._minDistance) {\n\t\t\tthis._minDistance = maxDistance;\n\t\t}\n\t},\n\n\tgetFixedDistance: function() {\n\t\treturn this._minDistance == this._maxDistance\n\t\t\t? this._minDistance : null;\n\t},\n\n\tsetFixedDistance: function(distance) {\n\t\tthis._minDistance = this._maxDistance = distance;\n\t},\n\n\t_handleMouseEvent: function(type, event, point, mouse) {\n\t\tpaper = this._scope;\n\t\tif (mouse.drag && !this.responds(type))\n\t\t\ttype = 'mousemove';\n\t\tvar move = mouse.move || mouse.drag,\n\t\t\tresponds = this.responds(type),\n\t\t\tcalled = false,\n\t\t\ttool = this;\n\t\tfunction update(minDistance, maxDistance) {\n\t\t\tvar pt = point,\n\t\t\t\ttoolPoint = move ? tool._point : (tool._downPoint || pt);\n\t\t\tif (move) {\n\t\t\t\tif (tool._moveCount >= 0 && pt.equals(toolPoint)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (toolPoint && (minDistance != null || maxDistance != null)) {\n\t\t\t\t\tvar vector = pt.subtract(toolPoint),\n\t\t\t\t\t\tdistance = vector.getLength();\n\t\t\t\t\tif (distance < (minDistance || 0))\n\t\t\t\t\t\treturn false;\n\t\t\t\t\tif (maxDistance) {\n\t\t\t\t\t\tpt = toolPoint.add(vector.normalize(\n\t\t\t\t\t\t\t\tMath.min(distance, maxDistance)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttool._moveCount++;\n\t\t\t}\n\t\t\ttool._point = pt;\n\t\t\ttool._lastPoint = toolPoint || pt;\n\t\t\tif (mouse.down) {\n\t\t\t\ttool._moveCount = -1;\n\t\t\t\ttool._downPoint = pt;\n\t\t\t\ttool._downCount++;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tfunction emit() {\n\t\t\tif (responds) {\n\t\t\t\tcalled = tool.emit(type, new ToolEvent(tool, type, event))\n\t\t\t\t\t\t|| called;\n\t\t\t}\n\t\t}\n\n\t\tif (mouse.down) {\n\t\t\tupdate();\n\t\t\temit();\n\t\t} else if (mouse.up) {\n\t\t\tupdate(null, this._maxDistance);\n\t\t\temit();\n\t\t} else if (responds) {\n\t\t\twhile (update(this._minDistance, this._maxDistance))\n\t\t\t\temit();\n\t\t}\n\t\treturn called;\n\t}\n\n});\n\nvar Tween = Base.extend(Emitter, {\n\t_class: 'Tween',\n\n\tstatics: {\n\t\teasings: new Base({\n\t\t\tlinear: function(t) {\n\t\t\t\treturn t;\n\t\t\t},\n\n\t\t\teaseInQuad: function(t) {\n\t\t\t\treturn t * t;\n\t\t\t},\n\n\t\t\teaseOutQuad: function(t) {\n\t\t\t\treturn t * (2 - t);\n\t\t\t},\n\n\t\t\teaseInOutQuad: function(t) {\n\t\t\t\treturn t < 0.5\n\t\t\t\t\t? 2 * t * t\n\t\t\t\t\t: -1 + 2 * (2 - t) * t;\n\t\t\t},\n\n\t\t\teaseInCubic: function(t) {\n\t\t\t\treturn t * t * t;\n\t\t\t},\n\n\t\t\teaseOutCubic: function(t) {\n\t\t\t\treturn --t * t * t + 1;\n\t\t\t},\n\n\t\t\teaseInOutCubic: function(t) {\n\t\t\t\treturn t < 0.5\n\t\t\t\t\t? 4 * t * t * t\n\t\t\t\t\t: (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n\t\t\t},\n\n\t\t\teaseInQuart: function(t) {\n\t\t\t\treturn t * t * t * t;\n\t\t\t},\n\n\t\t\teaseOutQuart: function(t) {\n\t\t\t\treturn 1 - (--t) * t * t * t;\n\t\t\t},\n\n\t\t\teaseInOutQuart: function(t) {\n\t\t\t\treturn t < 0.5\n\t\t\t\t\t? 8 * t * t * t * t\n\t\t\t\t\t: 1 - 8 * (--t) * t * t * t;\n\t\t\t},\n\n\t\t\teaseInQuint: function(t) {\n\t\t\t\treturn t * t * t * t * t;\n\t\t\t},\n\n\t\t\teaseOutQuint: function(t) {\n\t\t\t\treturn 1 + --t * t * t * t * t;\n\t\t\t},\n\n\t\t\teaseInOutQuint: function(t) {\n\t\t\t\treturn t < 0.5\n\t\t\t\t\t? 16 * t * t * t * t * t\n\t\t\t\t\t: 1 + 16 * (--t) * t * t * t * t;\n\t\t\t}\n\t\t})\n\t},\n\n\tinitialize: function Tween(object, from, to, duration, easing, start) {\n\t\tthis.object = object;\n\t\tvar type = typeof easing;\n\t\tvar isFunction = type === 'function';\n\t\tthis.type = isFunction\n\t\t\t? type\n\t\t\t: type === 'string'\n\t\t\t\t? easing\n\t\t\t\t: 'linear';\n\t\tthis.easing = isFunction ? easing : Tween.easings[this.type];\n\t\tthis.duration = duration;\n\t\tthis.running = false;\n\n\t\tthis._then = null;\n\t\tthis._startTime = null;\n\t\tvar state = from || to;\n\t\tthis._keys = state ? Object.keys(state) : [];\n\t\tthis._parsedKeys = this._parseKeys(this._keys);\n\t\tthis._from = state && this._getState(from);\n\t\tthis._to = state && this._getState(to);\n\t\tif (start !== false) {\n\t\t\tthis.start();\n\t\t}\n\t},\n\n\tthen: function(then) {\n\t\tthis._then = then;\n\t\treturn this;\n\t},\n\n\tstart: function() {\n\t\tthis._startTime = null;\n\t\tthis.running = true;\n\t\treturn this;\n\t},\n\n\tstop: function() {\n\t\tthis.running = false;\n\t\treturn this;\n\t},\n\n\tupdate: function(progress) {\n\t\tif (this.running) {\n\t\t\tif (progress >= 1) {\n\t\t\t\tprogress = 1;\n\t\t\t\tthis.running = false;\n\t\t\t}\n\n\t\t\tvar factor = this.easing(progress),\n\t\t\t\tkeys = this._keys,\n\t\t\t\tgetValue = function(value) {\n\t\t\t\t\treturn typeof value === 'function'\n\t\t\t\t\t\t? value(factor, progress)\n\t\t\t\t\t\t: value;\n\t\t\t\t};\n\t\t\tfor (var i = 0, l = keys && keys.length; i < l; i++) {\n\t\t\t\tvar key = keys[i],\n\t\t\t\t\tfrom = getValue(this._from[key]),\n\t\t\t\t\tto = getValue(this._to[key]),\n\t\t\t\t\tvalue = (from && to && from.__add && to.__add)\n\t\t\t\t\t\t? to.__subtract(from).__multiply(factor).__add(from)\n\t\t\t\t\t\t: ((to - from) * factor) + from;\n\t\t\t\tthis._setProperty(this._parsedKeys[key], value);\n\t\t\t}\n\n\t\t\tif (this.responds('update')) {\n\t\t\t\tthis.emit('update', new Base({\n\t\t\t\t\tprogress: progress,\n\t\t\t\t\tfactor: factor\n\t\t\t\t}));\n\t\t\t}\n\t\t\tif (!this.running && this._then) {\n\t\t\t\tthis._then(this.object);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\t_events: {\n\t\tonUpdate: {}\n\t},\n\n\t_handleFrame: function(time) {\n\t\tvar startTime = this._startTime,\n\t\t\tprogress = startTime\n\t\t\t\t? (time - startTime) / this.duration\n\t\t\t\t: 0;\n\t\tif (!startTime) {\n\t\t\tthis._startTime = time;\n\t\t}\n\t\tthis.update(progress);\n\t},\n\n\t_getState: function(state) {\n\t\tvar keys = this._keys,\n\t\t\tresult = {};\n\t\tfor (var i = 0, l = keys.length; i < l; i++) {\n\t\t\tvar key = keys[i],\n\t\t\t\tpath = this._parsedKeys[key],\n\t\t\t\tcurrent = this._getProperty(path),\n\t\t\t\tvalue;\n\t\t\tif (state) {\n\t\t\t\tvar resolved = this._resolveValue(current, state[key]);\n\t\t\t\tthis._setProperty(path, resolved);\n\t\t\t\tvalue = this._getProperty(path);\n\t\t\t\tvalue = value && value.clone ? value.clone() : value;\n\t\t\t\tthis._setProperty(path, current);\n\t\t\t} else {\n\t\t\t\tvalue = current && current.clone ? current.clone() : current;\n\t\t\t}\n\t\t\tresult[key] = value;\n\t\t}\n\t\treturn result;\n\t},\n\n\t_resolveValue: function(current, value) {\n\t\tif (value) {\n\t\t\tif (Array.isArray(value) && value.length === 2) {\n\t\t\t\tvar operator = value[0];\n\t\t\t\treturn (\n\t\t\t\t\toperator &&\n\t\t\t\t\toperator.match &&\n\t\t\t\t\toperator.match(/^[+\\-\\*\\/]=/)\n\t\t\t\t)\n\t\t\t\t\t? this._calculate(current, operator[0], value[1])\n\t\t\t\t\t: value;\n\t\t\t} else if (typeof value === 'string') {\n\t\t\t\tvar match = value.match(/^[+\\-*/]=(.*)/);\n\t\t\t\tif (match) {\n\t\t\t\t\tvar parsed = JSON.parse(match[1].replace(\n\t\t\t\t\t\t/(['\"])?([a-zA-Z0-9_]+)(['\"])?:/g,\n\t\t\t\t\t\t'\"$2\": '\n\t\t\t\t\t));\n\t\t\t\t\treturn this._calculate(current, value[0], parsed);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t},\n\n\t_calculate: function(left, operator, right) {\n\t\treturn paper.PaperScript.calculateBinary(left, operator, right);\n\t},\n\n\t_parseKeys: function(keys) {\n\t\tvar parsed = {};\n\t\tfor (var i = 0, l = keys.length; i < l; i++) {\n\t\t\tvar key = keys[i],\n\t\t\t\tpath = key\n\t\t\t\t\t.replace(/\\.([^.]*)/g, '/$1')\n\t\t\t\t\t.replace(/\\[['\"]?([^'\"\\]]*)['\"]?\\]/g, '/$1');\n\t\t\tparsed[key] = path.split('/');\n\t\t}\n\t\treturn parsed;\n\t},\n\n\t_getProperty: function(path, offset) {\n\t\tvar obj = this.object;\n\t\tfor (var i = 0, l = path.length - (offset || 0); i < l && obj; i++) {\n\t\t\tobj = obj[path[i]];\n\t\t}\n\t\treturn obj;\n\t},\n\n\t_setProperty: function(path, value) {\n\t\tvar dest = this._getProperty(path, 1);\n\t\tif (dest) {\n\t\t\tdest[path[path.length - 1]] = value;\n\t\t}\n\t}\n});\n\nvar Http = {\n\trequest: function(options) {\n\t\tvar xhr = new self.XMLHttpRequest();\n\t\txhr.open((options.method || 'get').toUpperCase(), options.url,\n\t\t\t\tBase.pick(options.async, true));\n\t\tif (options.mimeType)\n\t\t\txhr.overrideMimeType(options.mimeType);\n\t\txhr.onload = function() {\n\t\t\tvar status = xhr.status;\n\t\t\tif (status === 0 || status === 200) {\n\t\t\t\tif (options.onLoad) {\n\t\t\t\t\toptions.onLoad.call(xhr, xhr.responseText);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\txhr.onerror();\n\t\t\t}\n\t\t};\n\t\txhr.onerror = function() {\n\t\t\tvar status = xhr.status,\n\t\t\t\tmessage = 'Could not load \"' + options.url + '\" (Status: '\n\t\t\t\t\t\t+ status + ')';\n\t\t\tif (options.onError) {\n\t\t\t\toptions.onError(message, status);\n\t\t\t} else {\n\t\t\t\tthrow new Error(message);\n\t\t\t}\n\t\t};\n\t\treturn xhr.send(null);\n\t}\n};\n\nvar CanvasProvider = Base.exports.CanvasProvider = {\n\tcanvases: [],\n\n\tgetCanvas: function(width, height, options) {\n\t\tif (!window)\n\t\t\treturn null;\n\t\tvar canvas,\n\t\t\tclear = true;\n\t\tif (typeof width === 'object') {\n\t\t\theight = width.height;\n\t\t\twidth = width.width;\n\t\t}\n\t\tif (this.canvases.length) {\n\t\t\tcanvas = this.canvases.pop();\n\t\t} else {\n\t\t\tcanvas = document.createElement('canvas');\n\t\t\tclear = false;\n\t\t}\n\t\tvar ctx = canvas.getContext('2d', options || {});\n\t\tif (!ctx) {\n\t\t\tthrow new Error('Canvas ' + canvas +\n\t\t\t\t\t' is unable to provide a 2D context.');\n\t\t}\n\t\tif (canvas.width === width && canvas.height === height) {\n\t\t\tif (clear)\n\t\t\t\tctx.clearRect(0, 0, width + 1, height + 1);\n\t\t} else {\n\t\t\tcanvas.width = width;\n\t\t\tcanvas.height = height;\n\t\t}\n\t\tctx.save();\n\t\treturn canvas;\n\t},\n\n\tgetContext: function(width, height, options) {\n\t\tvar canvas = this.getCanvas(width, height, options);\n\t\treturn canvas ? canvas.getContext('2d', options || {}) : null;\n\t},\n\n\trelease: function(obj) {\n\t\tvar canvas = obj && obj.canvas ? obj.canvas : obj;\n\t\tif (canvas && canvas.getContext) {\n\t\t\tcanvas.getContext('2d').restore();\n\t\t\tthis.canvases.push(canvas);\n\t\t}\n\t}\n};\n\nvar BlendMode = new function() {\n\tvar min = Math.min,\n\t\tmax = Math.max,\n\t\tabs = Math.abs,\n\t\tsr, sg, sb, sa,\n\t\tbr, bg, bb, ba,\n\t\tdr, dg, db;\n\n\tfunction getLum(r, g, b) {\n\t\treturn 0.2989 * r + 0.587 * g + 0.114 * b;\n\t}\n\n\tfunction setLum(r, g, b, l) {\n\t\tvar d = l - getLum(r, g, b);\n\t\tdr = r + d;\n\t\tdg = g + d;\n\t\tdb = b + d;\n\t\tvar l = getLum(dr, dg, db),\n\t\t\tmn = min(dr, dg, db),\n\t\t\tmx = max(dr, dg, db);\n\t\tif (mn < 0) {\n\t\t\tvar lmn = l - mn;\n\t\t\tdr = l + (dr - l) * l / lmn;\n\t\t\tdg = l + (dg - l) * l / lmn;\n\t\t\tdb = l + (db - l) * l / lmn;\n\t\t}\n\t\tif (mx > 255) {\n\t\t\tvar ln = 255 - l,\n\t\t\t\tmxl = mx - l;\n\t\t\tdr = l + (dr - l) * ln / mxl;\n\t\t\tdg = l + (dg - l) * ln / mxl;\n\t\t\tdb = l + (db - l) * ln / mxl;\n\t\t}\n\t}\n\n\tfunction getSat(r, g, b) {\n\t\treturn max(r, g, b) - min(r, g, b);\n\t}\n\n\tfunction setSat(r, g, b, s) {\n\t\tvar col = [r, g, b],\n\t\t\tmx = max(r, g, b),\n\t\t\tmn = min(r, g, b),\n\t\t\tmd;\n\t\tmn = mn === r ? 0 : mn === g ? 1 : 2;\n\t\tmx = mx === r ? 0 : mx === g ? 1 : 2;\n\t\tmd = min(mn, mx) === 0 ? max(mn, mx) === 1 ? 2 : 1 : 0;\n\t\tif (col[mx] > col[mn]) {\n\t\t\tcol[md] = (col[md] - col[mn]) * s / (col[mx] - col[mn]);\n\t\t\tcol[mx] = s;\n\t\t} else {\n\t\t\tcol[md] = col[mx] = 0;\n\t\t}\n\t\tcol[mn] = 0;\n\t\tdr = col[0];\n\t\tdg = col[1];\n\t\tdb = col[2];\n\t}\n\n\tvar modes = {\n\t\tmultiply: function() {\n\t\t\tdr = br * sr / 255;\n\t\t\tdg = bg * sg / 255;\n\t\t\tdb = bb * sb / 255;\n\t\t},\n\n\t\tscreen: function() {\n\t\t\tdr = br + sr - (br * sr / 255);\n\t\t\tdg = bg + sg - (bg * sg / 255);\n\t\t\tdb = bb + sb - (bb * sb / 255);\n\t\t},\n\n\t\toverlay: function() {\n\t\t\tdr = br < 128 ? 2 * br * sr / 255 : 255 - 2 * (255 - br) * (255 - sr) / 255;\n\t\t\tdg = bg < 128 ? 2 * bg * sg / 255 : 255 - 2 * (255 - bg) * (255 - sg) / 255;\n\t\t\tdb = bb < 128 ? 2 * bb * sb / 255 : 255 - 2 * (255 - bb) * (255 - sb) / 255;\n\t\t},\n\n\t\t'soft-light': function() {\n\t\t\tvar t = sr * br / 255;\n\t\t\tdr = t + br * (255 - (255 - br) * (255 - sr) / 255 - t) / 255;\n\t\t\tt = sg * bg / 255;\n\t\t\tdg = t + bg * (255 - (255 - bg) * (255 - sg) / 255 - t) / 255;\n\t\t\tt = sb * bb / 255;\n\t\t\tdb = t + bb * (255 - (255 - bb) * (255 - sb) / 255 - t) / 255;\n\t\t},\n\n\t\t'hard-light': function() {\n\t\t\tdr = sr < 128 ? 2 * sr * br / 255 : 255 - 2 * (255 - sr) * (255 - br) / 255;\n\t\t\tdg = sg < 128 ? 2 * sg * bg / 255 : 255 - 2 * (255 - sg) * (255 - bg) / 255;\n\t\t\tdb = sb < 128 ? 2 * sb * bb / 255 : 255 - 2 * (255 - sb) * (255 - bb) / 255;\n\t\t},\n\n\t\t'color-dodge': function() {\n\t\t\tdr = br === 0 ? 0 : sr === 255 ? 255 : min(255, 255 * br / (255 - sr));\n\t\t\tdg = bg === 0 ? 0 : sg === 255 ? 255 : min(255, 255 * bg / (255 - sg));\n\t\t\tdb = bb === 0 ? 0 : sb === 255 ? 255 : min(255, 255 * bb / (255 - sb));\n\t\t},\n\n\t\t'color-burn': function() {\n\t\t\tdr = br === 255 ? 255 : sr === 0 ? 0 : max(0, 255 - (255 - br) * 255 / sr);\n\t\t\tdg = bg === 255 ? 255 : sg === 0 ? 0 : max(0, 255 - (255 - bg) * 255 / sg);\n\t\t\tdb = bb === 255 ? 255 : sb === 0 ? 0 : max(0, 255 - (255 - bb) * 255 / sb);\n\t\t},\n\n\t\tdarken: function() {\n\t\t\tdr = br < sr ? br : sr;\n\t\t\tdg = bg < sg ? bg : sg;\n\t\t\tdb = bb < sb ? bb : sb;\n\t\t},\n\n\t\tlighten: function() {\n\t\t\tdr = br > sr ? br : sr;\n\t\t\tdg = bg > sg ? bg : sg;\n\t\t\tdb = bb > sb ? bb : sb;\n\t\t},\n\n\t\tdifference: function() {\n\t\t\tdr = br - sr;\n\t\t\tif (dr < 0)\n\t\t\t\tdr = -dr;\n\t\t\tdg = bg - sg;\n\t\t\tif (dg < 0)\n\t\t\t\tdg = -dg;\n\t\t\tdb = bb - sb;\n\t\t\tif (db < 0)\n\t\t\t\tdb = -db;\n\t\t},\n\n\t\texclusion: function() {\n\t\t\tdr = br + sr * (255 - br - br) / 255;\n\t\t\tdg = bg + sg * (255 - bg - bg) / 255;\n\t\t\tdb = bb + sb * (255 - bb - bb) / 255;\n\t\t},\n\n\t\thue: function() {\n\t\t\tsetSat(sr, sg, sb, getSat(br, bg, bb));\n\t\t\tsetLum(dr, dg, db, getLum(br, bg, bb));\n\t\t},\n\n\t\tsaturation: function() {\n\t\t\tsetSat(br, bg, bb, getSat(sr, sg, sb));\n\t\t\tsetLum(dr, dg, db, getLum(br, bg, bb));\n\t\t},\n\n\t\tluminosity: function() {\n\t\t\tsetLum(br, bg, bb, getLum(sr, sg, sb));\n\t\t},\n\n\t\tcolor: function() {\n\t\t\tsetLum(sr, sg, sb, getLum(br, bg, bb));\n\t\t},\n\n\t\tadd: function() {\n\t\t\tdr = min(br + sr, 255);\n\t\t\tdg = min(bg + sg, 255);\n\t\t\tdb = min(bb + sb, 255);\n\t\t},\n\n\t\tsubtract: function() {\n\t\t\tdr = max(br - sr, 0);\n\t\t\tdg = max(bg - sg, 0);\n\t\t\tdb = max(bb - sb, 0);\n\t\t},\n\n\t\taverage: function() {\n\t\t\tdr = (br + sr) / 2;\n\t\t\tdg = (bg + sg) / 2;\n\t\t\tdb = (bb + sb) / 2;\n\t\t},\n\n\t\tnegation: function() {\n\t\t\tdr = 255 - abs(255 - sr - br);\n\t\t\tdg = 255 - abs(255 - sg - bg);\n\t\t\tdb = 255 - abs(255 - sb - bb);\n\t\t}\n\t};\n\n\tvar nativeModes = this.nativeModes = Base.each([\n\t\t'source-over', 'source-in', 'source-out', 'source-atop',\n\t\t'destination-over', 'destination-in', 'destination-out',\n\t\t'destination-atop', 'lighter', 'darker', 'copy', 'xor'\n\t], function(mode) {\n\t\tthis[mode] = true;\n\t}, {});\n\n\tvar ctx = CanvasProvider.getContext(1, 1, { willReadFrequently: true });\n\tif (ctx) {\n\t\tBase.each(modes, function(func, mode) {\n\t\t\tvar darken = mode === 'darken',\n\t\t\t\tok = false;\n\t\t\tctx.save();\n\t\t\ttry {\n\t\t\t\tctx.fillStyle = darken ? '#300' : '#a00';\n\t\t\t\tctx.fillRect(0, 0, 1, 1);\n\t\t\t\tctx.globalCompositeOperation = mode;\n\t\t\t\tif (ctx.globalCompositeOperation === mode) {\n\t\t\t\t\tctx.fillStyle = darken ? '#a00' : '#300';\n\t\t\t\t\tctx.fillRect(0, 0, 1, 1);\n\t\t\t\t\tok = ctx.getImageData(0, 0, 1, 1).data[0] !== darken\n\t\t\t\t\t\t\t? 170 : 51;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\t\t\tctx.restore();\n\t\t\tnativeModes[mode] = ok;\n\t\t});\n\t\tCanvasProvider.release(ctx);\n\t}\n\n\tthis.process = function(mode, srcContext, dstContext, alpha, offset) {\n\t\tvar srcCanvas = srcContext.canvas,\n\t\t\tnormal = mode === 'normal';\n\t\tif (normal || nativeModes[mode]) {\n\t\t\tdstContext.save();\n\t\t\tdstContext.setTransform(1, 0, 0, 1, 0, 0);\n\t\t\tdstContext.globalAlpha = alpha;\n\t\t\tif (!normal)\n\t\t\t\tdstContext.globalCompositeOperation = mode;\n\t\t\tdstContext.drawImage(srcCanvas, offset.x, offset.y);\n\t\t\tdstContext.restore();\n\t\t} else {\n\t\t\tvar process = modes[mode];\n\t\t\tif (!process)\n\t\t\t\treturn;\n\t\t\tvar dstData = dstContext.getImageData(offset.x, offset.y,\n\t\t\t\t\tsrcCanvas.width, srcCanvas.height),\n\t\t\t\tdst = dstData.data,\n\t\t\t\tsrc = srcContext.getImageData(0, 0,\n\t\t\t\t\tsrcCanvas.width, srcCanvas.height).data;\n\t\t\tfor (var i = 0, l = dst.length; i < l; i += 4) {\n\t\t\t\tsr = src[i];\n\t\t\t\tbr = dst[i];\n\t\t\t\tsg = src[i + 1];\n\t\t\t\tbg = dst[i + 1];\n\t\t\t\tsb = src[i + 2];\n\t\t\t\tbb = dst[i + 2];\n\t\t\t\tsa = src[i + 3];\n\t\t\t\tba = dst[i + 3];\n\t\t\t\tprocess();\n\t\t\t\tvar a1 = sa * alpha / 255,\n\t\t\t\t\ta2 = 1 - a1;\n\t\t\t\tdst[i] = a1 * dr + a2 * br;\n\t\t\t\tdst[i + 1] = a1 * dg + a2 * bg;\n\t\t\t\tdst[i + 2] = a1 * db + a2 * bb;\n\t\t\t\tdst[i + 3] = sa * alpha + a2 * ba;\n\t\t\t}\n\t\t\tdstContext.putImageData(dstData, offset.x, offset.y);\n\t\t}\n\t};\n};\n\nvar SvgElement = new function() {\n\tvar svg = 'http://www.w3.org/2000/svg',\n\t\txmlns = 'http://www.w3.org/2000/xmlns',\n\t\txlink = 'http://www.w3.org/1999/xlink',\n\t\tattributeNamespace = {\n\t\t\thref: xlink,\n\t\t\txlink: xmlns,\n\t\t\txmlns: xmlns + '/',\n\t\t\t'xmlns:xlink': xmlns + '/'\n\t\t};\n\n\tfunction create(tag, attributes, formatter) {\n\t\treturn set(document.createElementNS(svg, tag), attributes, formatter);\n\t}\n\n\tfunction get(node, name) {\n\t\tvar namespace = attributeNamespace[name],\n\t\t\tvalue = namespace\n\t\t\t\t? node.getAttributeNS(namespace, name)\n\t\t\t\t: node.getAttribute(name);\n\t\treturn value === 'null' ? null : value;\n\t}\n\n\tfunction set(node, attributes, formatter) {\n\t\tfor (var name in attributes) {\n\t\t\tvar value = attributes[name],\n\t\t\t\tnamespace = attributeNamespace[name];\n\t\t\tif (typeof value === 'number' && formatter)\n\t\t\t\tvalue = formatter.number(value);\n\t\t\tif (namespace) {\n\t\t\t\tnode.setAttributeNS(namespace, name, value);\n\t\t\t} else {\n\t\t\t\tnode.setAttribute(name, value);\n\t\t\t}\n\t\t}\n\t\treturn node;\n\t}\n\n\treturn {\n\t\tsvg: svg,\n\t\txmlns: xmlns,\n\t\txlink: xlink,\n\n\t\tcreate: create,\n\t\tget: get,\n\t\tset: set\n\t};\n};\n\nvar SvgStyles = Base.each({\n\tfillColor: ['fill', 'color'],\n\tfillRule: ['fill-rule', 'string'],\n\tstrokeColor: ['stroke', 'color'],\n\tstrokeWidth: ['stroke-width', 'number'],\n\tstrokeCap: ['stroke-linecap', 'string'],\n\tstrokeJoin: ['stroke-linejoin', 'string'],\n\tstrokeScaling: ['vector-effect', 'lookup', {\n\t\ttrue: 'none',\n\t\tfalse: 'non-scaling-stroke'\n\t}, function(item, value) {\n\t\treturn !value\n\t\t\t\t&& (item instanceof PathItem\n\t\t\t\t\t|| item instanceof Shape\n\t\t\t\t\t|| item instanceof TextItem);\n\t}],\n\tmiterLimit: ['stroke-miterlimit', 'number'],\n\tdashArray: ['stroke-dasharray', 'array'],\n\tdashOffset: ['stroke-dashoffset', 'number'],\n\tfontFamily: ['font-family', 'string'],\n\tfontWeight: ['font-weight', 'string'],\n\tfontSize: ['font-size', 'number'],\n\tjustification: ['text-anchor', 'lookup', {\n\t\tleft: 'start',\n\t\tcenter: 'middle',\n\t\tright: 'end'\n\t}],\n\topacity: ['opacity', 'number'],\n\tblendMode: ['mix-blend-mode', 'style']\n}, function(entry, key) {\n\tvar part = Base.capitalize(key),\n\t\tlookup = entry[2];\n\tthis[key] = {\n\t\ttype: entry[1],\n\t\tproperty: key,\n\t\tattribute: entry[0],\n\t\ttoSVG: lookup,\n\t\tfromSVG: lookup && Base.each(lookup, function(value, name) {\n\t\t\tthis[value] = name;\n\t\t}, {}),\n\t\texportFilter: entry[3],\n\t\tget: 'get' + part,\n\t\tset: 'set' + part\n\t};\n}, {});\n\nnew function() {\n\tvar formatter;\n\n\tfunction getTransform(matrix, coordinates, center) {\n\t\tvar attrs = new Base(),\n\t\t\ttrans = matrix.getTranslation();\n\t\tif (coordinates) {\n\t\t\tvar point;\n\t\t\tif (matrix.isInvertible()) {\n\t\t\t\tmatrix = matrix._shiftless();\n\t\t\t\tpoint = matrix._inverseTransform(trans);\n\t\t\t\ttrans = null;\n\t\t\t} else {\n\t\t\t\tpoint = new Point();\n\t\t\t}\n\t\t\tattrs[center ? 'cx' : 'x'] = point.x;\n\t\t\tattrs[center ? 'cy' : 'y'] = point.y;\n\t\t}\n\t\tif (!matrix.isIdentity()) {\n\t\t\tvar decomposed = matrix.decompose();\n\t\t\tif (decomposed) {\n\t\t\t\tvar parts = [],\n\t\t\t\t\tangle = decomposed.rotation,\n\t\t\t\t\tscale = decomposed.scaling,\n\t\t\t\t\tskew = decomposed.skewing;\n\t\t\t\tif (trans && !trans.isZero())\n\t\t\t\t\tparts.push('translate(' + formatter.point(trans) + ')');\n\t\t\t\tif (angle)\n\t\t\t\t\tparts.push('rotate(' + formatter.number(angle) + ')');\n\t\t\t\tif (!Numerical.isZero(scale.x - 1)\n\t\t\t\t\t\t|| !Numerical.isZero(scale.y - 1))\n\t\t\t\t\tparts.push('scale(' + formatter.point(scale) +')');\n\t\t\t\tif (skew.x)\n\t\t\t\t\tparts.push('skewX(' + formatter.number(skew.x) + ')');\n\t\t\t\tif (skew.y)\n\t\t\t\t\tparts.push('skewY(' + formatter.number(skew.y) + ')');\n\t\t\t\tattrs.transform = parts.join(' ');\n\t\t\t} else {\n\t\t\t\tattrs.transform = 'matrix(' + matrix.getValues().join(',') + ')';\n\t\t\t}\n\t\t}\n\t\treturn attrs;\n\t}\n\n\tfunction exportGroup(item, options) {\n\t\tvar attrs = getTransform(item._matrix),\n\t\t\tchildren = item._children;\n\t\tvar node = SvgElement.create('g', attrs, formatter);\n\t\tfor (var i = 0, l = children.length; i < l; i++) {\n\t\t\tvar child = children[i];\n\t\t\tvar childNode = exportSVG(child, options);\n\t\t\tif (childNode) {\n\t\t\t\tif (child.isClipMask()) {\n\t\t\t\t\tvar clip = SvgElement.create('clipPath');\n\t\t\t\t\tclip.appendChild(childNode);\n\t\t\t\t\tsetDefinition(child, clip, 'clip');\n\t\t\t\t\tSvgElement.set(node, {\n\t\t\t\t\t\t'clip-path': 'url(#' + clip.id + ')'\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tnode.appendChild(childNode);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn node;\n\t}\n\n\tfunction exportRaster(item, options) {\n\t\tvar attrs = getTransform(item._matrix, true),\n\t\t\tsize = item.getSize(),\n\t\t\timage = item.getImage();\n\t\tattrs.x -= size.width / 2;\n\t\tattrs.y -= size.height / 2;\n\t\tattrs.width = size.width;\n\t\tattrs.height = size.height;\n\t\tattrs.href = options.embedImages == false && image && image.src\n\t\t\t\t|| item.toDataURL();\n\t\treturn SvgElement.create('image', attrs, formatter);\n\t}\n\n\tfunction exportPath(item, options) {\n\t\tvar matchShapes = options.matchShapes;\n\t\tif (matchShapes) {\n\t\t\tvar shape = item.toShape(false);\n\t\t\tif (shape)\n\t\t\t\treturn exportShape(shape, options);\n\t\t}\n\t\tvar segments = item._segments,\n\t\t\tlength = segments.length,\n\t\t\ttype,\n\t\t\tattrs = getTransform(item._matrix);\n\t\tif (matchShapes && length >= 2 && !item.hasHandles()) {\n\t\t\tif (length > 2) {\n\t\t\t\ttype = item._closed ? 'polygon' : 'polyline';\n\t\t\t\tvar parts = [];\n\t\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\t\tparts.push(formatter.point(segments[i]._point));\n\t\t\t\t}\n\t\t\t\tattrs.points = parts.join(' ');\n\t\t\t} else {\n\t\t\t\ttype = 'line';\n\t\t\t\tvar start = segments[0]._point,\n\t\t\t\t\tend = segments[1]._point;\n\t\t\t\tattrs.set({\n\t\t\t\t\tx1: start.x,\n\t\t\t\t\ty1: start.y,\n\t\t\t\t\tx2: end.x,\n\t\t\t\t\ty2: end.y\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\ttype = 'path';\n\t\t\tattrs.d = item.getPathData(null, options.precision);\n\t\t}\n\t\treturn SvgElement.create(type, attrs, formatter);\n\t}\n\n\tfunction exportShape(item) {\n\t\tvar type = item._type,\n\t\t\tradius = item._radius,\n\t\t\tattrs = getTransform(item._matrix, true, type !== 'rectangle');\n\t\tif (type === 'rectangle') {\n\t\t\ttype = 'rect';\n\t\t\tvar size = item._size,\n\t\t\t\twidth = size.width,\n\t\t\t\theight = size.height;\n\t\t\tattrs.x -= width / 2;\n\t\t\tattrs.y -= height / 2;\n\t\t\tattrs.width = width;\n\t\t\tattrs.height = height;\n\t\t\tif (radius.isZero())\n\t\t\t\tradius = null;\n\t\t}\n\t\tif (radius) {\n\t\t\tif (type === 'circle') {\n\t\t\t\tattrs.r = radius;\n\t\t\t} else {\n\t\t\t\tattrs.rx = radius.width;\n\t\t\t\tattrs.ry = radius.height;\n\t\t\t}\n\t\t}\n\t\treturn SvgElement.create(type, attrs, formatter);\n\t}\n\n\tfunction exportCompoundPath(item, options) {\n\t\tvar attrs = getTransform(item._matrix);\n\t\tvar data = item.getPathData(null, options.precision);\n\t\tif (data)\n\t\t\tattrs.d = data;\n\t\treturn SvgElement.create('path', attrs, formatter);\n\t}\n\n\tfunction exportSymbolItem(item, options) {\n\t\tvar attrs = getTransform(item._matrix, true),\n\t\t\tdefinition = item._definition,\n\t\t\tnode = getDefinition(definition, 'symbol'),\n\t\t\tdefinitionItem = definition._item,\n\t\t\tbounds = definitionItem.getStrokeBounds();\n\t\tif (!node) {\n\t\t\tnode = SvgElement.create('symbol', {\n\t\t\t\tviewBox: formatter.rectangle(bounds)\n\t\t\t});\n\t\t\tnode.appendChild(exportSVG(definitionItem, options));\n\t\t\tsetDefinition(definition, node, 'symbol');\n\t\t}\n\t\tattrs.href = '#' + node.id;\n\t\tattrs.x += bounds.x;\n\t\tattrs.y += bounds.y;\n\t\tattrs.width = bounds.width;\n\t\tattrs.height = bounds.height;\n\t\tattrs.overflow = 'visible';\n\t\treturn SvgElement.create('use', attrs, formatter);\n\t}\n\n\tfunction exportGradient(color) {\n\t\tvar gradientNode = getDefinition(color, 'color');\n\t\tif (!gradientNode) {\n\t\t\tvar gradient = color.getGradient(),\n\t\t\t\tradial = gradient._radial,\n\t\t\t\torigin = color.getOrigin(),\n\t\t\t\tdestination = color.getDestination(),\n\t\t\t\tattrs;\n\t\t\tif (radial) {\n\t\t\t\tattrs = {\n\t\t\t\t\tcx: origin.x,\n\t\t\t\t\tcy: origin.y,\n\t\t\t\t\tr: origin.getDistance(destination)\n\t\t\t\t};\n\t\t\t\tvar highlight = color.getHighlight();\n\t\t\t\tif (highlight) {\n\t\t\t\t\tattrs.fx = highlight.x;\n\t\t\t\t\tattrs.fy = highlight.y;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tattrs = {\n\t\t\t\t\tx1: origin.x,\n\t\t\t\t\ty1: origin.y,\n\t\t\t\t\tx2: destination.x,\n\t\t\t\t\ty2: destination.y\n\t\t\t\t};\n\t\t\t}\n\t\t\tattrs.gradientUnits = 'userSpaceOnUse';\n\t\t\tgradientNode = SvgElement.create((radial ? 'radial' : 'linear')\n\t\t\t\t\t+ 'Gradient', attrs, formatter);\n\t\t\tvar stops = gradient._stops;\n\t\t\tfor (var i = 0, l = stops.length; i < l; i++) {\n\t\t\t\tvar stop = stops[i],\n\t\t\t\t\tstopColor = stop._color,\n\t\t\t\t\talpha = stopColor.getAlpha(),\n\t\t\t\t\toffset = stop._offset;\n\t\t\t\tattrs = {\n\t\t\t\t\toffset: offset == null ? i / (l - 1) : offset\n\t\t\t\t};\n\t\t\t\tif (stopColor)\n\t\t\t\t\tattrs['stop-color'] = stopColor.toCSS(true);\n\t\t\t\tif (alpha < 1)\n\t\t\t\t\tattrs['stop-opacity'] = alpha;\n\t\t\t\tgradientNode.appendChild(\n\t\t\t\t\t\tSvgElement.create('stop', attrs, formatter));\n\t\t\t}\n\t\t\tsetDefinition(color, gradientNode, 'color');\n\t\t}\n\t\treturn 'url(#' + gradientNode.id + ')';\n\t}\n\n\tfunction exportText(item) {\n\t\tvar node = SvgElement.create('text', getTransform(item._matrix, true),\n\t\t\t\tformatter);\n\t\tnode.textContent = item._content;\n\t\treturn node;\n\t}\n\n\tvar exporters = {\n\t\tGroup: exportGroup,\n\t\tLayer: exportGroup,\n\t\tRaster: exportRaster,\n\t\tPath: exportPath,\n\t\tShape: exportShape,\n\t\tCompoundPath: exportCompoundPath,\n\t\tSymbolItem: exportSymbolItem,\n\t\tPointText: exportText\n\t};\n\n\tfunction applyStyle(item, node, options, isRoot) {\n\t\tvar attrs = {},\n\t\t\tparent = !isRoot && item.getParent(),\n\t\t\tstyle = [];\n\n\t\tif (item._name != null)\n\t\t\tattrs.id = item._name;\n\n\t\tBase.each(SvgStyles, function(entry) {\n\t\t\tvar get = entry.get,\n\t\t\t\ttype = entry.type,\n\t\t\t\tvalue = item[get]();\n\t\t\tif (entry.exportFilter\n\t\t\t\t\t? entry.exportFilter(item, value)\n\t\t\t\t\t: options.reduceAttributes == false\n\t\t\t\t\t\t|| !parent || !Base.equals(parent[get](), value)) {\n\t\t\t\tif (type === 'color' && value != null) {\n\t\t\t\t\tvar alpha = value.getAlpha();\n\t\t\t\t\tif (alpha < 1)\n\t\t\t\t\t\tattrs[entry.attribute + '-opacity'] = alpha;\n\t\t\t\t}\n\t\t\t\tif (type === 'style') {\n\t\t\t\t\tstyle.push(entry.attribute + ': ' + value);\n\t\t\t\t} else {\n\t\t\t\t\tattrs[entry.attribute] = value == null ? 'none'\n\t\t\t\t\t\t\t: type === 'color' ? value.gradient\n\t\t\t\t\t\t\t\t? exportGradient(value, item)\n\t\t\t\t\t\t\t\t: value.toCSS(true)\n\t\t\t\t\t\t\t: type === 'array' ? value.join(',')\n\t\t\t\t\t\t\t: type === 'lookup' ? entry.toSVG[value]\n\t\t\t\t\t\t\t: value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif (style.length)\n\t\t\tattrs.style = style.join(';');\n\n\t\tif (attrs.opacity === 1)\n\t\t\tdelete attrs.opacity;\n\n\t\tif (!item._visible)\n\t\t\tattrs.visibility = 'hidden';\n\n\t\treturn SvgElement.set(node, attrs, formatter);\n\t}\n\n\tvar definitions;\n\tfunction getDefinition(item, type) {\n\t\tif (!definitions)\n\t\t\tdefinitions = { ids: {}, svgs: {} };\n\t\treturn item && definitions.svgs[type + '-'\n\t\t\t\t+ (item._id || item.__id || (item.__id = UID.get('svg')))];\n\t}\n\n\tfunction setDefinition(item, node, type) {\n\t\tif (!definitions)\n\t\t\tgetDefinition();\n\t\tvar typeId = definitions.ids[type] = (definitions.ids[type] || 0) + 1;\n\t\tnode.id = type + '-' + typeId;\n\t\tdefinitions.svgs[type + '-' + (item._id || item.__id)] = node;\n\t}\n\n\tfunction exportDefinitions(node, options) {\n\t\tvar svg = node,\n\t\t\tdefs = null;\n\t\tif (definitions) {\n\t\t\tsvg = node.nodeName.toLowerCase() === 'svg' && node;\n\t\t\tfor (var i in definitions.svgs) {\n\t\t\t\tif (!defs) {\n\t\t\t\t\tif (!svg) {\n\t\t\t\t\t\tsvg = SvgElement.create('svg');\n\t\t\t\t\t\tsvg.appendChild(node);\n\t\t\t\t\t}\n\t\t\t\t\tdefs = svg.insertBefore(SvgElement.create('defs'),\n\t\t\t\t\t\t\tsvg.firstChild);\n\t\t\t\t}\n\t\t\t\tdefs.appendChild(definitions.svgs[i]);\n\t\t\t}\n\t\t\tdefinitions = null;\n\t\t}\n\t\treturn options.asString\n\t\t\t\t? new self.XMLSerializer().serializeToString(svg)\n\t\t\t\t: svg;\n\t}\n\n\tfunction exportSVG(item, options, isRoot) {\n\t\tvar exporter = exporters[item._class],\n\t\t\tnode = exporter && exporter(item, options);\n\t\tif (node) {\n\t\t\tvar onExport = options.onExport;\n\t\t\tif (onExport)\n\t\t\t\tnode = onExport(item, node, options) || node;\n\t\t\tvar data = JSON.stringify(item._data);\n\t\t\tif (data && data !== '{}' && data !== 'null')\n\t\t\t\tnode.setAttribute('data-paper-data', data);\n\t\t}\n\t\treturn node && applyStyle(item, node, options, isRoot);\n\t}\n\n\tfunction setOptions(options) {\n\t\tif (!options)\n\t\t\toptions = {};\n\t\tformatter = new Formatter(options.precision);\n\t\treturn options;\n\t}\n\n\tItem.inject({\n\t\texportSVG: function(options) {\n\t\t\toptions = setOptions(options);\n\t\t\treturn exportDefinitions(exportSVG(this, options, true), options);\n\t\t}\n\t});\n\n\tProject.inject({\n\t\texportSVG: function(options) {\n\t\t\toptions = setOptions(options);\n\t\t\tvar children = this._children,\n\t\t\t\tview = this.getView(),\n\t\t\t\tbounds = Base.pick(options.bounds, 'view'),\n\t\t\t\tmx = options.matrix || bounds === 'view' && view._matrix,\n\t\t\t\tmatrix = mx && Matrix.read([mx]),\n\t\t\t\trect = bounds === 'view'\n\t\t\t\t\t? new Rectangle([0, 0], view.getViewSize())\n\t\t\t\t\t: bounds === 'content'\n\t\t\t\t\t\t? Item._getBounds(children, matrix, { stroke: true })\n\t\t\t\t\t\t\t.rect\n\t\t\t\t\t\t: Rectangle.read([bounds], 0, { readNull: true }),\n\t\t\t\tattrs = {\n\t\t\t\t\tversion: '1.1',\n\t\t\t\t\txmlns: SvgElement.svg,\n\t\t\t\t\t'xmlns:xlink': SvgElement.xlink,\n\t\t\t\t};\n\t\t\tif (rect) {\n\t\t\t\tattrs.width = rect.width;\n\t\t\t\tattrs.height = rect.height;\n\t\t\t\tif (rect.x || rect.x === 0 || rect.y || rect.y === 0)\n\t\t\t\t\tattrs.viewBox = formatter.rectangle(rect);\n\t\t\t}\n\t\t\tvar node = SvgElement.create('svg', attrs, formatter),\n\t\t\t\tparent = node;\n\t\t\tif (matrix && !matrix.isIdentity()) {\n\t\t\t\tparent = node.appendChild(SvgElement.create('g',\n\t\t\t\t\t\tgetTransform(matrix), formatter));\n\t\t\t}\n\t\t\tfor (var i = 0, l = children.length; i < l; i++) {\n\t\t\t\tparent.appendChild(exportSVG(children[i], options, true));\n\t\t\t}\n\t\t\treturn exportDefinitions(node, options);\n\t\t}\n\t});\n};\n\nnew function() {\n\n\tvar definitions = {},\n\t\trootSize;\n\n\tfunction getValue(node, name, isString, allowNull, allowPercent,\n\t\t\tdefaultValue) {\n\t\tvar value = SvgElement.get(node, name) || defaultValue,\n\t\t\tres = value == null\n\t\t\t\t? allowNull\n\t\t\t\t\t? null\n\t\t\t\t\t: isString ? '' : 0\n\t\t\t\t: isString\n\t\t\t\t\t? value\n\t\t\t\t\t: parseFloat(value);\n\t\treturn /%\\s*$/.test(value)\n\t\t\t? (res / 100) * (allowPercent ? 1\n\t\t\t\t: rootSize[/x|^width/.test(name) ? 'width' : 'height'])\n\t\t\t: res;\n\t}\n\n\tfunction getPoint(node, x, y, allowNull, allowPercent, defaultX, defaultY) {\n\t\tx = getValue(node, x || 'x', false, allowNull, allowPercent, defaultX);\n\t\ty = getValue(node, y || 'y', false, allowNull, allowPercent, defaultY);\n\t\treturn allowNull && (x == null || y == null) ? null\n\t\t\t\t: new Point(x, y);\n\t}\n\n\tfunction getSize(node, w, h, allowNull, allowPercent) {\n\t\tw = getValue(node, w || 'width', false, allowNull, allowPercent);\n\t\th = getValue(node, h || 'height', false, allowNull, allowPercent);\n\t\treturn allowNull && (w == null || h == null) ? null\n\t\t\t\t: new Size(w, h);\n\t}\n\n\tfunction convertValue(value, type, lookup) {\n\t\treturn value === 'none' ? null\n\t\t\t\t: type === 'number' ? parseFloat(value)\n\t\t\t\t: type === 'array' ?\n\t\t\t\t\tvalue ? value.split(/[\\s,]+/g).map(parseFloat) : []\n\t\t\t\t: type === 'color' ? getDefinition(value) || value\n\t\t\t\t: type === 'lookup' ? lookup[value]\n\t\t\t\t: value;\n\t}\n\n\tfunction importGroup(node, type, options, isRoot) {\n\t\tvar nodes = node.childNodes,\n\t\t\tisClip = type === 'clippath',\n\t\t\tisDefs = type === 'defs',\n\t\t\titem = new Group(),\n\t\t\tproject = item._project,\n\t\t\tcurrentStyle = project._currentStyle,\n\t\t\tchildren = [];\n\t\tif (!isClip && !isDefs) {\n\t\t\titem = applyAttributes(item, node, isRoot);\n\t\t\tproject._currentStyle = item._style.clone();\n\t\t}\n\t\tif (isRoot) {\n\t\t\tvar defs = node.querySelectorAll('defs');\n\t\t\tfor (var i = 0, l = defs.length; i < l; i++) {\n\t\t\t\timportNode(defs[i], options, false);\n\t\t\t}\n\t\t}\n\t\tfor (var i = 0, l = nodes.length; i < l; i++) {\n\t\t\tvar childNode = nodes[i],\n\t\t\t\tchild;\n\t\t\tif (childNode.nodeType === 1\n\t\t\t\t\t&& !/^defs$/i.test(childNode.nodeName)\n\t\t\t\t\t&& (child = importNode(childNode, options, false))\n\t\t\t\t\t&& !(child instanceof SymbolDefinition))\n\t\t\t\tchildren.push(child);\n\t\t}\n\t\titem.addChildren(children);\n\t\tif (isClip)\n\t\t\titem = applyAttributes(item.reduce(), node, isRoot);\n\t\tproject._currentStyle = currentStyle;\n\t\tif (isClip || isDefs) {\n\t\t\titem.remove();\n\t\t\titem = null;\n\t\t}\n\t\treturn item;\n\t}\n\n\tfunction importPoly(node, type) {\n\t\tvar coords = node.getAttribute('points').match(\n\t\t\t\t\t/[+-]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][+-]?\\d+)?/g),\n\t\t\tpoints = [];\n\t\tfor (var i = 0, l = coords.length; i < l; i += 2)\n\t\t\tpoints.push(new Point(\n\t\t\t\t\tparseFloat(coords[i]),\n\t\t\t\t\tparseFloat(coords[i + 1])));\n\t\tvar path = new Path(points);\n\t\tif (type === 'polygon')\n\t\t\tpath.closePath();\n\t\treturn path;\n\t}\n\n\tfunction importPath(node) {\n\t\treturn PathItem.create(node.getAttribute('d'));\n\t}\n\n\tfunction importGradient(node, type) {\n\t\tvar id = (getValue(node, 'href', true) || '').substring(1),\n\t\t\tradial = type === 'radialgradient',\n\t\t\tgradient;\n\t\tif (id) {\n\t\t\tgradient = definitions[id].getGradient();\n\t\t\tif (gradient._radial ^ radial) {\n\t\t\t\tgradient = gradient.clone();\n\t\t\t\tgradient._radial = radial;\n\t\t\t}\n\t\t} else {\n\t\t\tvar nodes = node.childNodes,\n\t\t\t\tstops = [];\n\t\t\tfor (var i = 0, l = nodes.length; i < l; i++) {\n\t\t\t\tvar child = nodes[i];\n\t\t\t\tif (child.nodeType === 1)\n\t\t\t\t\tstops.push(applyAttributes(new GradientStop(), child));\n\t\t\t}\n\t\t\tgradient = new Gradient(stops, radial);\n\t\t}\n\t\tvar origin, destination, highlight,\n\t\t\tscaleToBounds = getValue(node, 'gradientUnits', true) !==\n\t\t\t\t'userSpaceOnUse';\n\t\tif (radial) {\n\t\t\torigin = getPoint(node, 'cx', 'cy', false, scaleToBounds,\n\t\t\t\t'50%', '50%');\n\t\t\tdestination = origin.add(\n\t\t\t\tgetValue(node, 'r', false, false, scaleToBounds, '50%'), 0);\n\t\t\thighlight = getPoint(node, 'fx', 'fy', true, scaleToBounds);\n\t\t} else {\n\t\t\torigin = getPoint(node, 'x1', 'y1', false, scaleToBounds,\n\t\t\t\t'0%', '0%');\n\t\t\tdestination = getPoint(node, 'x2', 'y2', false, scaleToBounds,\n\t\t\t\t'100%', '0%');\n\t\t}\n\t\tvar color = applyAttributes(\n\t\t\t\tnew Color(gradient, origin, destination, highlight), node);\n\t\tcolor._scaleToBounds = scaleToBounds;\n\t\treturn null;\n\t}\n\n\tvar importers = {\n\t\t'#document': function (node, type, options, isRoot) {\n\t\t\tvar nodes = node.childNodes;\n\t\t\tfor (var i = 0, l = nodes.length; i < l; i++) {\n\t\t\t\tvar child = nodes[i];\n\t\t\t\tif (child.nodeType === 1)\n\t\t\t\t\treturn importNode(child, options, isRoot);\n\t\t\t}\n\t\t},\n\t\tg: importGroup,\n\t\tsvg: importGroup,\n\t\tclippath: importGroup,\n\t\tpolygon: importPoly,\n\t\tpolyline: importPoly,\n\t\tpath: importPath,\n\t\tlineargradient: importGradient,\n\t\tradialgradient: importGradient,\n\n\t\timage: function (node) {\n\t\t\tvar raster = new Raster(getValue(node, 'href', true));\n\t\t\traster.on('load', function() {\n\t\t\t\tvar size = getSize(node);\n\t\t\t\tthis.setSize(size);\n\t\t\t\tvar center = getPoint(node).add(size.divide(2));\n\t\t\t\tthis._matrix.append(new Matrix().translate(center));\n\t\t\t});\n\t\t\treturn raster;\n\t\t},\n\n\t\tsymbol: function(node, type, options, isRoot) {\n\t\t\treturn new SymbolDefinition(\n\t\t\t\t\timportGroup(node, type, options, isRoot), true);\n\t\t},\n\n\t\tdefs: importGroup,\n\n\t\tuse: function(node) {\n\t\t\tvar id = (getValue(node, 'href', true) || '').substring(1),\n\t\t\t\tdefinition = definitions[id],\n\t\t\t\tpoint = getPoint(node);\n\t\t\treturn definition\n\t\t\t\t\t? definition instanceof SymbolDefinition\n\t\t\t\t\t\t? definition.place(point)\n\t\t\t\t\t\t: definition.clone().translate(point)\n\t\t\t\t\t: null;\n\t\t},\n\n\t\tcircle: function(node) {\n\t\t\treturn new Shape.Circle(\n\t\t\t\t\tgetPoint(node, 'cx', 'cy'),\n\t\t\t\t\tgetValue(node, 'r'));\n\t\t},\n\n\t\tellipse: function(node) {\n\t\t\treturn new Shape.Ellipse({\n\t\t\t\tcenter: getPoint(node, 'cx', 'cy'),\n\t\t\t\tradius: getSize(node, 'rx', 'ry')\n\t\t\t});\n\t\t},\n\n\t\trect: function(node) {\n\t\t\treturn new Shape.Rectangle(new Rectangle(\n\t\t\t\t\t\tgetPoint(node),\n\t\t\t\t\t\tgetSize(node)\n\t\t\t\t\t), getSize(node, 'rx', 'ry'));\n\t\t\t},\n\n\t\tline: function(node) {\n\t\t\treturn new Path.Line(\n\t\t\t\t\tgetPoint(node, 'x1', 'y1'),\n\t\t\t\t\tgetPoint(node, 'x2', 'y2'));\n\t\t},\n\n\t\ttext: function(node) {\n\t\t\tvar text = new PointText(getPoint(node).add(\n\t\t\t\t\tgetPoint(node, 'dx', 'dy')));\n\t\t\ttext.setContent(node.textContent.trim() || '');\n\t\t\treturn text;\n\t\t},\n\n\t\tswitch: importGroup\n\t};\n\n\tfunction applyTransform(item, value, name, node) {\n\t\tif (item.transform) {\n\t\t\tvar transforms = (node.getAttribute(name) || '').split(/\\)\\s*/g),\n\t\t\t\tmatrix = new Matrix();\n\t\t\tfor (var i = 0, l = transforms.length; i < l; i++) {\n\t\t\t\tvar transform = transforms[i];\n\t\t\t\tif (!transform)\n\t\t\t\t\tbreak;\n\t\t\t\tvar parts = transform.split(/\\(\\s*/),\n\t\t\t\t\tcommand = parts[0].trim(),\n\t\t\t\t\tv = parts[1].split(/[\\s,]+/g);\n\t\t\t\tfor (var j = 0, m = v.length; j < m; j++)\n\t\t\t\t\tv[j] = parseFloat(v[j]);\n\t\t\t\tswitch (command) {\n\t\t\t\tcase 'matrix':\n\t\t\t\t\tmatrix.append(\n\t\t\t\t\t\t\tnew Matrix(v[0], v[1], v[2], v[3], v[4], v[5]));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'rotate':\n\t\t\t\t\tmatrix.rotate(v[0], v[1] || 0, v[2] || 0);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'translate':\n\t\t\t\t\tmatrix.translate(v[0], v[1] || 0);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'scale':\n\t\t\t\t\tmatrix.scale(v);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'skewX':\n\t\t\t\t\tmatrix.skew(v[0], 0);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'skewY':\n\t\t\t\t\tmatrix.skew(0, v[0]);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\titem.transform(matrix);\n\t\t}\n\t}\n\n\tfunction applyOpacity(item, value, name) {\n\t\tvar key = name === 'fill-opacity' ? 'getFillColor' : 'getStrokeColor',\n\t\t\tcolor = item[key] && item[key]();\n\t\tif (color)\n\t\t\tcolor.setAlpha(parseFloat(value));\n\t}\n\n\tvar attributes = Base.set(Base.each(SvgStyles, function(entry) {\n\t\tthis[entry.attribute] = function(item, value) {\n\t\t\tif (item[entry.set]) {\n\t\t\t\titem[entry.set](convertValue(value, entry.type, entry.fromSVG));\n\t\t\t\tif (entry.type === 'color') {\n\t\t\t\t\tvar color = item[entry.get]();\n\t\t\t\t\tif (color) {\n\t\t\t\t\t\tif (color._scaleToBounds) {\n\t\t\t\t\t\t\tvar bounds = item.getBounds();\n\t\t\t\t\t\t\tcolor.transform(new Matrix()\n\t\t\t\t\t\t\t\t.translate(bounds.getPoint())\n\t\t\t\t\t\t\t\t.scale(bounds.getSize()));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}, {}), {\n\t\tid: function(item, value) {\n\t\t\tdefinitions[value] = item;\n\t\t\tif (item.setName)\n\t\t\t\titem.setName(value);\n\t\t},\n\n\t\t'clip-path': function(item, value) {\n\t\t\tvar clip = getDefinition(value);\n\t\t\tif (clip) {\n\t\t\t\tclip = clip.clone();\n\t\t\t\tclip.setClipMask(true);\n\t\t\t\tif (item instanceof Group) {\n\t\t\t\t\titem.insertChild(0, clip);\n\t\t\t\t} else {\n\t\t\t\t\treturn new Group(clip, item);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tgradientTransform: applyTransform,\n\t\ttransform: applyTransform,\n\n\t\t'fill-opacity': applyOpacity,\n\t\t'stroke-opacity': applyOpacity,\n\n\t\tvisibility: function(item, value) {\n\t\t\tif (item.setVisible)\n\t\t\t\titem.setVisible(value === 'visible');\n\t\t},\n\n\t\tdisplay: function(item, value) {\n\t\t\tif (item.setVisible)\n\t\t\t\titem.setVisible(value !== null);\n\t\t},\n\n\t\t'stop-color': function(item, value) {\n\t\t\tif (item.setColor)\n\t\t\t\titem.setColor(value);\n\t\t},\n\n\t\t'stop-opacity': function(item, value) {\n\t\t\tif (item._color)\n\t\t\t\titem._color.setAlpha(parseFloat(value));\n\t\t},\n\n\t\toffset: function(item, value) {\n\t\t\tif (item.setOffset) {\n\t\t\t\tvar percent = value.match(/(.*)%$/);\n\t\t\t\titem.setOffset(percent ? percent[1] / 100 : parseFloat(value));\n\t\t\t}\n\t\t},\n\n\t\tviewBox: function(item, value, name, node, styles) {\n\t\t\tvar rect = new Rectangle(convertValue(value, 'array')),\n\t\t\t\tsize = getSize(node, null, null, true),\n\t\t\t\tgroup,\n\t\t\t\tmatrix;\n\t\t\tif (item instanceof Group) {\n\t\t\t\tvar scale = size ? size.divide(rect.getSize()) : 1,\n\t\t\t\tmatrix = new Matrix().scale(scale)\n\t\t\t\t\t\t.translate(rect.getPoint().negate());\n\t\t\t\tgroup = item;\n\t\t\t} else if (item instanceof SymbolDefinition) {\n\t\t\t\tif (size)\n\t\t\t\t\trect.setSize(size);\n\t\t\t\tgroup = item._item;\n\t\t\t}\n\t\t\tif (group) {\n\t\t\t\tif (getAttribute(node, 'overflow', styles) !== 'visible') {\n\t\t\t\t\tvar clip = new Shape.Rectangle(rect);\n\t\t\t\t\tclip.setClipMask(true);\n\t\t\t\t\tgroup.addChild(clip);\n\t\t\t\t}\n\t\t\t\tif (matrix)\n\t\t\t\t\tgroup.transform(matrix);\n\t\t\t}\n\t\t}\n\t});\n\n\tfunction getAttribute(node, name, styles) {\n\t\tvar attr = node.attributes[name],\n\t\t\tvalue = attr && attr.value;\n\t\tif (!value && node.style) {\n\t\t\tvar style = Base.camelize(name);\n\t\t\tvalue = node.style[style];\n\t\t\tif (!value && styles.node[style] !== styles.parent[style])\n\t\t\t\tvalue = styles.node[style];\n\t\t}\n\t\treturn !value ? undefined\n\t\t\t\t: value === 'none' ? null\n\t\t\t\t: value;\n\t}\n\n\tfunction applyAttributes(item, node, isRoot) {\n\t\tvar parent = node.parentNode,\n\t\t\tstyles = {\n\t\t\t\tnode: DomElement.getStyles(node) || {},\n\t\t\t\tparent: !isRoot && !/^defs$/i.test(parent.tagName)\n\t\t\t\t\t\t&& DomElement.getStyles(parent) || {}\n\t\t\t};\n\t\tBase.each(attributes, function(apply, name) {\n\t\t\tvar value = getAttribute(node, name, styles);\n\t\t\titem = value !== undefined\n\t\t\t\t\t&& apply(item, value, name, node, styles) || item;\n\t\t});\n\t\treturn item;\n\t}\n\n\tfunction getDefinition(value) {\n\t\tvar match = value && value.match(/\\((?:[\"'#]*)([^\"')]+)/),\n\t\t\tname = match && match[1],\n\t\t\tres = name && definitions[window\n\t\t\t\t\t? name.replace(window.location.href.split('#')[0] + '#', '')\n\t\t\t\t\t: name];\n\t\tif (res && res._scaleToBounds) {\n\t\t\tres = res.clone();\n\t\t\tres._scaleToBounds = true;\n\t\t}\n\t\treturn res;\n\t}\n\n\tfunction importNode(node, options, isRoot) {\n\t\tvar type = node.nodeName.toLowerCase(),\n\t\t\tisElement = type !== '#document',\n\t\t\tbody = document.body,\n\t\t\tcontainer,\n\t\t\tparent,\n\t\t\tnext;\n\t\tif (isRoot && isElement) {\n\t\t\trootSize = paper.getView().getSize();\n\t\t\trootSize = getSize(node, null, null, true) || rootSize;\n\t\t\tcontainer = SvgElement.create('svg', {\n\t\t\t\tstyle: 'stroke-width: 1px; stroke-miterlimit: 10'\n\t\t\t});\n\t\t\tparent = node.parentNode;\n\t\t\tnext = node.nextSibling;\n\t\t\tcontainer.appendChild(node);\n\t\t\tbody.appendChild(container);\n\t\t}\n\t\tvar settings = paper.settings,\n\t\t\tapplyMatrix = settings.applyMatrix,\n\t\t\tinsertItems = settings.insertItems;\n\t\tsettings.applyMatrix = false;\n\t\tsettings.insertItems = false;\n\t\tvar importer = importers[type],\n\t\t\titem = importer && importer(node, type, options, isRoot) || null;\n\t\tsettings.insertItems = insertItems;\n\t\tsettings.applyMatrix = applyMatrix;\n\t\tif (item) {\n\t\t\tif (isElement && !(item instanceof Group))\n\t\t\t\titem = applyAttributes(item, node, isRoot);\n\t\t\tvar onImport = options.onImport,\n\t\t\t\tdata = isElement && node.getAttribute('data-paper-data');\n\t\t\tif (onImport)\n\t\t\t\titem = onImport(node, item, options) || item;\n\t\t\tif (options.expandShapes && item instanceof Shape) {\n\t\t\t\titem.remove();\n\t\t\t\titem = item.toPath();\n\t\t\t}\n\t\t\tif (data)\n\t\t\t\titem._data = JSON.parse(data);\n\t\t}\n\t\tif (container) {\n\t\t\tbody.removeChild(container);\n\t\t\tif (parent) {\n\t\t\t\tif (next) {\n\t\t\t\t\tparent.insertBefore(node, next);\n\t\t\t\t} else {\n\t\t\t\t\tparent.appendChild(node);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (isRoot) {\n\t\t\tdefinitions = {};\n\t\t\tif (item && Base.pick(options.applyMatrix, applyMatrix))\n\t\t\t\titem.matrix.apply(true, true);\n\t\t}\n\t\treturn item;\n\t}\n\n\tfunction importSVG(source, options, owner) {\n\t\tif (!source)\n\t\t\treturn null;\n\t\toptions = typeof options === 'function' ? { onLoad: options }\n\t\t\t\t: options || {};\n\t\tvar scope = paper,\n\t\t\titem = null;\n\n\t\tfunction onLoad(svg) {\n\t\t\ttry {\n\t\t\t\tvar node = typeof svg === 'object'\n\t\t\t\t\t? svg\n\t\t\t\t\t: new self.DOMParser().parseFromString(\n\t\t\t\t\t\tsvg.trim(),\n\t\t\t\t\t\t'image/svg+xml'\n\t\t\t\t\t);\n\t\t\t\tif (!node.nodeName) {\n\t\t\t\t\tnode = null;\n\t\t\t\t\tthrow new Error('Unsupported SVG source: ' + source);\n\t\t\t\t}\n\t\t\t\tpaper = scope;\n\t\t\t\titem = importNode(node, options, true);\n\t\t\t\tif (!options || options.insert !== false) {\n\t\t\t\t\towner._insertItem(undefined, item);\n\t\t\t\t}\n\t\t\t\tvar onLoad = options.onLoad;\n\t\t\t\tif (onLoad)\n\t\t\t\t\tonLoad(item, svg);\n\t\t\t} catch (e) {\n\t\t\t\tonError(e);\n\t\t\t}\n\t\t}\n\n\t\tfunction onError(message, status) {\n\t\t\tvar onError = options.onError;\n\t\t\tif (onError) {\n\t\t\t\tonError(message, status);\n\t\t\t} else {\n\t\t\t\tthrow new Error(message);\n\t\t\t}\n\t\t}\n\n\t\tif (typeof source === 'string' && !/^[\\s\\S]*</.test(source)) {\n\t\t\tvar node = document.getElementById(source);\n\t\t\tif (node) {\n\t\t\t\tonLoad(node);\n\t\t\t} else {\n\t\t\t\tHttp.request({\n\t\t\t\t\turl: source,\n\t\t\t\t\tasync: true,\n\t\t\t\t\tonLoad: onLoad,\n\t\t\t\t\tonError: onError\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (typeof File !== 'undefined' && source instanceof File) {\n\t\t\tvar reader = new FileReader();\n\t\t\treader.onload = function() {\n\t\t\t\tonLoad(reader.result);\n\t\t\t};\n\t\t\treader.onerror = function() {\n\t\t\t\tonError(reader.error);\n\t\t\t};\n\t\t\treturn reader.readAsText(source);\n\t\t} else {\n\t\t\tonLoad(source);\n\t\t}\n\n\t\treturn item;\n\t}\n\n\tItem.inject({\n\t\timportSVG: function(node, options) {\n\t\t\treturn importSVG(node, options, this);\n\t\t}\n\t});\n\n\tProject.inject({\n\t\timportSVG: function(node, options) {\n\t\t\tthis.activate();\n\t\t\treturn importSVG(node, options, this);\n\t\t}\n\t});\n};\n\nBase.exports.PaperScript = function() {\n\tvar global = this,\n\t\tacorn = global.acorn;\n\tif (!acorn && typeof require !== 'undefined') {\n\t\ttry { acorn = require('acorn'); } catch(e) {}\n\t}\n\tif (!acorn) {\n\t\tvar exports, module;\n\t\tacorn = exports = module = {};\n\n(function(root, mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") return mod(exports);\n if (typeof define == \"function\" && define.amd) return define([\"exports\"], mod);\n mod(root.acorn || (root.acorn = {}));\n})(this, function(exports) {\n \"use strict\";\n\n exports.version = \"0.5.0\";\n\n var options, input, inputLen, sourceFile;\n\n exports.parse = function(inpt, opts) {\n\tinput = String(inpt); inputLen = input.length;\n\tsetOptions(opts);\n\tinitTokenState();\n\treturn parseTopLevel(options.program);\n };\n\n var defaultOptions = exports.defaultOptions = {\n\tecmaVersion: 5,\n\tstrictSemicolons: false,\n\tallowTrailingCommas: true,\n\tforbidReserved: false,\n\tallowReturnOutsideFunction: false,\n\tlocations: false,\n\tonComment: null,\n\tranges: false,\n\tprogram: null,\n\tsourceFile: null,\n\tdirectSourceFile: null\n };\n\n function setOptions(opts) {\n\toptions = opts || {};\n\tfor (var opt in defaultOptions) if (!Object.prototype.hasOwnProperty.call(options, opt))\n\t options[opt] = defaultOptions[opt];\n\tsourceFile = options.sourceFile || null;\n }\n\n var getLineInfo = exports.getLineInfo = function(input, offset) {\n\tfor (var line = 1, cur = 0;;) {\n\t lineBreak.lastIndex = cur;\n\t var match = lineBreak.exec(input);\n\t if (match && match.index < offset) {\n\t\t++line;\n\t\tcur = match.index + match[0].length;\n\t } else break;\n\t}\n\treturn {line: line, column: offset - cur};\n };\n\n exports.tokenize = function(inpt, opts) {\n\tinput = String(inpt); inputLen = input.length;\n\tsetOptions(opts);\n\tinitTokenState();\n\n\tvar t = {};\n\tfunction getToken(forceRegexp) {\n\t lastEnd = tokEnd;\n\t readToken(forceRegexp);\n\t t.start = tokStart; t.end = tokEnd;\n\t t.startLoc = tokStartLoc; t.endLoc = tokEndLoc;\n\t t.type = tokType; t.value = tokVal;\n\t return t;\n\t}\n\tgetToken.jumpTo = function(pos, reAllowed) {\n\t tokPos = pos;\n\t if (options.locations) {\n\t\ttokCurLine = 1;\n\t\ttokLineStart = lineBreak.lastIndex = 0;\n\t\tvar match;\n\t\twhile ((match = lineBreak.exec(input)) && match.index < pos) {\n\t\t ++tokCurLine;\n\t\t tokLineStart = match.index + match[0].length;\n\t\t}\n\t }\n\t tokRegexpAllowed = reAllowed;\n\t skipSpace();\n\t};\n\treturn getToken;\n };\n\n var tokPos;\n\n var tokStart, tokEnd;\n\n var tokStartLoc, tokEndLoc;\n\n var tokType, tokVal;\n\n var tokRegexpAllowed;\n\n var tokCurLine, tokLineStart;\n\n var lastStart, lastEnd, lastEndLoc;\n\n var inFunction, labels, strict;\n\n function raise(pos, message) {\n\tvar loc = getLineInfo(input, pos);\n\tmessage += \" (\" + loc.line + \":\" + loc.column + \")\";\n\tvar err = new SyntaxError(message);\n\terr.pos = pos; err.loc = loc; err.raisedAt = tokPos;\n\tthrow err;\n }\n\n var empty = [];\n\n var _num = {type: \"num\"}, _regexp = {type: \"regexp\"}, _string = {type: \"string\"};\n var _name = {type: \"name\"}, _eof = {type: \"eof\"};\n\n var _break = {keyword: \"break\"}, _case = {keyword: \"case\", beforeExpr: true}, _catch = {keyword: \"catch\"};\n var _continue = {keyword: \"continue\"}, _debugger = {keyword: \"debugger\"}, _default = {keyword: \"default\"};\n var _do = {keyword: \"do\", isLoop: true}, _else = {keyword: \"else\", beforeExpr: true};\n var _finally = {keyword: \"finally\"}, _for = {keyword: \"for\", isLoop: true}, _function = {keyword: \"function\"};\n var _if = {keyword: \"if\"}, _return = {keyword: \"return\", beforeExpr: true}, _switch = {keyword: \"switch\"};\n var _throw = {keyword: \"throw\", beforeExpr: true}, _try = {keyword: \"try\"}, _var = {keyword: \"var\"};\n var _while = {keyword: \"while\", isLoop: true}, _with = {keyword: \"with\"}, _new = {keyword: \"new\", beforeExpr: true};\n var _this = {keyword: \"this\"};\n\n var _null = {keyword: \"null\", atomValue: null}, _true = {keyword: \"true\", atomValue: true};\n var _false = {keyword: \"false\", atomValue: false};\n\n var _in = {keyword: \"in\", binop: 7, beforeExpr: true};\n\n var keywordTypes = {\"break\": _break, \"case\": _case, \"catch\": _catch,\n\t\t\t\t\t \"continue\": _continue, \"debugger\": _debugger, \"default\": _default,\n\t\t\t\t\t \"do\": _do, \"else\": _else, \"finally\": _finally, \"for\": _for,\n\t\t\t\t\t \"function\": _function, \"if\": _if, \"return\": _return, \"switch\": _switch,\n\t\t\t\t\t \"throw\": _throw, \"try\": _try, \"var\": _var, \"while\": _while, \"with\": _with,\n\t\t\t\t\t \"null\": _null, \"true\": _true, \"false\": _false, \"new\": _new, \"in\": _in,\n\t\t\t\t\t \"instanceof\": {keyword: \"instanceof\", binop: 7, beforeExpr: true}, \"this\": _this,\n\t\t\t\t\t \"typeof\": {keyword: \"typeof\", prefix: true, beforeExpr: true},\n\t\t\t\t\t \"void\": {keyword: \"void\", prefix: true, beforeExpr: true},\n\t\t\t\t\t \"delete\": {keyword: \"delete\", prefix: true, beforeExpr: true}};\n\n var _bracketL = {type: \"[\", beforeExpr: true}, _bracketR = {type: \"]\"}, _braceL = {type: \"{\", beforeExpr: true};\n var _braceR = {type: \"}\"}, _parenL = {type: \"(\", beforeExpr: true}, _parenR = {type: \")\"};\n var _comma = {type: \",\", beforeExpr: true}, _semi = {type: \";\", beforeExpr: true};\n var _colon = {type: \":\", beforeExpr: true}, _dot = {type: \".\"}, _question = {type: \"?\", beforeExpr: true};\n\n var _slash = {binop: 10, beforeExpr: true}, _eq = {isAssign: true, beforeExpr: true};\n var _assign = {isAssign: true, beforeExpr: true};\n var _incDec = {postfix: true, prefix: true, isUpdate: true}, _prefix = {prefix: true, beforeExpr: true};\n var _logicalOR = {binop: 1, beforeExpr: true};\n var _logicalAND = {binop: 2, beforeExpr: true};\n var _bitwiseOR = {binop: 3, beforeExpr: true};\n var _bitwiseXOR = {binop: 4, beforeExpr: true};\n var _bitwiseAND = {binop: 5, beforeExpr: true};\n var _equality = {binop: 6, beforeExpr: true};\n var _relational = {binop: 7, beforeExpr: true};\n var _bitShift = {binop: 8, beforeExpr: true};\n var _plusMin = {binop: 9, prefix: true, beforeExpr: true};\n var _multiplyModulo = {binop: 10, beforeExpr: true};\n\n exports.tokTypes = {bracketL: _bracketL, bracketR: _bracketR, braceL: _braceL, braceR: _braceR,\n\t\t\t\t\t parenL: _parenL, parenR: _parenR, comma: _comma, semi: _semi, colon: _colon,\n\t\t\t\t\t dot: _dot, question: _question, slash: _slash, eq: _eq, name: _name, eof: _eof,\n\t\t\t\t\t num: _num, regexp: _regexp, string: _string};\n for (var kw in keywordTypes) exports.tokTypes[\"_\" + kw] = keywordTypes[kw];\n\n function makePredicate(words) {\n\twords = words.split(\" \");\n\tvar f = \"\", cats = [];\n\tout: for (var i = 0; i < words.length; ++i) {\n\t for (var j = 0; j < cats.length; ++j)\n\t\tif (cats[j][0].length == words[i].length) {\n\t\t cats[j].push(words[i]);\n\t\t continue out;\n\t\t}\n\t cats.push([words[i]]);\n\t}\n\tfunction compareTo(arr) {\n\t if (arr.length == 1) return f += \"return str === \" + JSON.stringify(arr[0]) + \";\";\n\t f += \"switch(str){\";\n\t for (var i = 0; i < arr.length; ++i) f += \"case \" + JSON.stringify(arr[i]) + \":\";\n\t f += \"return true}return false;\";\n\t}\n\n\tif (cats.length > 3) {\n\t cats.sort(function(a, b) {return b.length - a.length;});\n\t f += \"switch(str.length){\";\n\t for (var i = 0; i < cats.length; ++i) {\n\t\tvar cat = cats[i];\n\t\tf += \"case \" + cat[0].length + \":\";\n\t\tcompareTo(cat);\n\t }\n\t f += \"}\";\n\n\t} else {\n\t compareTo(words);\n\t}\n\treturn new Function(\"str\", f);\n }\n\n var isReservedWord3 = makePredicate(\"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile\");\n\n var isReservedWord5 = makePredicate(\"class enum extends super const export import\");\n\n var isStrictReservedWord = makePredicate(\"implements interface let package private protected public static yield\");\n\n var isStrictBadIdWord = makePredicate(\"eval arguments\");\n\n var isKeyword = makePredicate(\"break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this\");\n\n var nonASCIIwhitespace = /[\\u1680\\u180e\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff]/;\n var nonASCIIidentifierStartChars = \"\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0370-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u048a-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05d0-\\u05ea\\u05f0-\\u05f2\\u0620-\\u064a\\u066e\\u066f\\u0671-\\u06d3\\u06d5\\u06e5\\u06e6\\u06ee\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\\u0712-\\u072f\\u074d-\\u07a5\\u07b1\\u07ca-\\u07ea\\u07f4\\u07f5\\u07fa\\u0800-\\u0815\\u081a\\u0824\\u0828\\u0840-\\u0858\\u08a0\\u08a2-\\u08ac\\u0904-\\u0939\\u093d\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097f\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc\\u09dd\\u09df-\\u09e1\\u09f0\\u09f1\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abd\\u0ad0\\u0ae0\\u0ae1\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bd0\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c33\\u0c35-\\u0c39\\u0c3d\\u0c58\\u0c59\\u0c60\\u0c61\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cde\\u0ce0\\u0ce1\\u0cf1\\u0cf2\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d\\u0d4e\\u0d60\\u0d61\\u0d7a-\\u0d7f\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0e01-\\u0e30\\u0e32\\u0e33\\u0e40-\\u0e46\\u0e81\\u0e82\\u0e84\\u0e87\\u0e88\\u0e8a\\u0e8d\\u0e94-\\u0e97\\u0e99-\\u0e9f\\u0ea1-\\u0ea3\\u0ea5\\u0ea7\\u0eaa\\u0eab\\u0ead-\\u0eb0\\u0eb2\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0edc-\\u0edf\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6c\\u0f88-\\u0f8c\\u1000-\\u102a\\u103f\\u1050-\\u1055\\u105a-\\u105d\\u1061\\u1065\\u1066\\u106e-\\u1070\\u1075-\\u1081\\u108e\\u10a0-\\u10c5\\u10c7\\u10cd\\u10d0-\\u10fa\\u10fc-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f4\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16ee-\\u16f0\\u1700-\\u170c\\u170e-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\\u17dc\\u1820-\\u1877\\u1880-\\u18a8\\u18aa\\u18b0-\\u18f5\\u1900-\\u191c\\u1950-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19c1-\\u19c7\\u1a00-\\u1a16\\u1a20-\\u1a54\\u1aa7\\u1b05-\\u1b33\\u1b45-\\u1b4b\\u1b83-\\u1ba0\\u1bae\\u1baf\\u1bba-\\u1be5\\u1c00-\\u1c23\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1ce9-\\u1cec\\u1cee-\\u1cf1\\u1cf5\\u1cf6\\u1d00-\\u1dbf\\u1e00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u209c\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2119-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u212d\\u212f-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2160-\\u2188\\u2c00-\\u2c2e\\u2c30-\\u2c5e\\u2c60-\\u2ce4\\u2ceb-\\u2cee\\u2cf2\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d80-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u2e2f\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303c\\u3041-\\u3096\\u309d-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312d\\u3131-\\u318e\\u31a0-\\u31ba\\u31f0-\\u31ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\ua000-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua66e\\ua67f-\\ua697\\ua6a0-\\ua6ef\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua78e\\ua790-\\ua793\\ua7a0-\\ua7aa\\ua7f8-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\\ua80c-\\ua822\\ua840-\\ua873\\ua882-\\ua8b3\\ua8f2-\\ua8f7\\ua8fb\\ua90a-\\ua925\\ua930-\\ua946\\ua960-\\ua97c\\ua984-\\ua9b2\\ua9cf\\uaa00-\\uaa28\\uaa40-\\uaa42\\uaa44-\\uaa4b\\uaa60-\\uaa76\\uaa7a\\uaa80-\\uaaaf\\uaab1\\uaab5\\uaab6\\uaab9-\\uaabd\\uaac0\\uaac2\\uaadb-\\uaadd\\uaae0-\\uaaea\\uaaf2-\\uaaf4\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uabc0-\\uabe2\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc\";\n var nonASCIIidentifierChars = \"\\u0300-\\u036f\\u0483-\\u0487\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u0620-\\u0649\\u0672-\\u06d3\\u06e7-\\u06e8\\u06fb-\\u06fc\\u0730-\\u074a\\u0800-\\u0814\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0840-\\u0857\\u08e4-\\u08fe\\u0900-\\u0903\\u093a-\\u093c\\u093e-\\u094f\\u0951-\\u0957\\u0962-\\u0963\\u0966-\\u096f\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7\\u09c8\\u09d7\\u09df-\\u09e0\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a66-\\u0a71\\u0a75\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ae2-\\u0ae3\\u0ae6-\\u0aef\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b56\\u0b57\\u0b5f-\\u0b60\\u0b66-\\u0b6f\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0be6-\\u0bef\\u0c01-\\u0c03\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62-\\u0c63\\u0c66-\\u0c6f\\u0c82\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0ce2-\\u0ce3\\u0ce6-\\u0cef\\u0d02\\u0d03\\u0d46-\\u0d48\\u0d57\\u0d62-\\u0d63\\u0d66-\\u0d6f\\u0d82\\u0d83\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0df2\\u0df3\\u0e34-\\u0e3a\\u0e40-\\u0e45\\u0e50-\\u0e59\\u0eb4-\\u0eb9\\u0ec8-\\u0ecd\\u0ed0-\\u0ed9\\u0f18\\u0f19\\u0f20-\\u0f29\\u0f35\\u0f37\\u0f39\\u0f41-\\u0f47\\u0f71-\\u0f84\\u0f86-\\u0f87\\u0f8d-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u1000-\\u1029\\u1040-\\u1049\\u1067-\\u106d\\u1071-\\u1074\\u1082-\\u108d\\u108f-\\u109d\\u135d-\\u135f\\u170e-\\u1710\\u1720-\\u1730\\u1740-\\u1750\\u1772\\u1773\\u1780-\\u17b2\\u17dd\\u17e0-\\u17e9\\u180b-\\u180d\\u1810-\\u1819\\u1920-\\u192b\\u1930-\\u193b\\u1951-\\u196d\\u19b0-\\u19c0\\u19c8-\\u19c9\\u19d0-\\u19d9\\u1a00-\\u1a15\\u1a20-\\u1a53\\u1a60-\\u1a7c\\u1a7f-\\u1a89\\u1a90-\\u1a99\\u1b46-\\u1b4b\\u1b50-\\u1b59\\u1b6b-\\u1b73\\u1bb0-\\u1bb9\\u1be6-\\u1bf3\\u1c00-\\u1c22\\u1c40-\\u1c49\\u1c5b-\\u1c7d\\u1cd0-\\u1cd2\\u1d00-\\u1dbe\\u1e01-\\u1f15\\u200c\\u200d\\u203f\\u2040\\u2054\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20f0\\u2d81-\\u2d96\\u2de0-\\u2dff\\u3021-\\u3028\\u3099\\u309a\\ua640-\\ua66d\\ua674-\\ua67d\\ua69f\\ua6f0-\\ua6f1\\ua7f8-\\ua800\\ua806\\ua80b\\ua823-\\ua827\\ua880-\\ua881\\ua8b4-\\ua8c4\\ua8d0-\\ua8d9\\ua8f3-\\ua8f7\\ua900-\\ua909\\ua926-\\ua92d\\ua930-\\ua945\\ua980-\\ua983\\ua9b3-\\ua9c0\\uaa00-\\uaa27\\uaa40-\\uaa41\\uaa4c-\\uaa4d\\uaa50-\\uaa59\\uaa7b\\uaae0-\\uaae9\\uaaf2-\\uaaf3\\uabc0-\\uabe1\\uabec\\uabed\\uabf0-\\uabf9\\ufb20-\\ufb28\\ufe00-\\ufe0f\\ufe20-\\ufe26\\ufe33\\ufe34\\ufe4d-\\ufe4f\\uff10-\\uff19\\uff3f\";\n var nonASCIIidentifierStart = new RegExp(\"[\" + nonASCIIidentifierStartChars + \"]\");\n var nonASCIIidentifier = new RegExp(\"[\" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"]\");\n\n var newline = /[\\n\\r\\u2028\\u2029]/;\n\n var lineBreak = /\\r\\n|[\\n\\r\\u2028\\u2029]/g;\n\n var isIdentifierStart = exports.isIdentifierStart = function(code) {\n\tif (code < 65) return code === 36;\n\tif (code < 91) return true;\n\tif (code < 97) return code === 95;\n\tif (code < 123)return true;\n\treturn code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code));\n };\n\n var isIdentifierChar = exports.isIdentifierChar = function(code) {\n\tif (code < 48) return code === 36;\n\tif (code < 58) return true;\n\tif (code < 65) return false;\n\tif (code < 91) return true;\n\tif (code < 97) return code === 95;\n\tif (code < 123)return true;\n\treturn code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code));\n };\n\n function line_loc_t() {\n\tthis.line = tokCurLine;\n\tthis.column = tokPos - tokLineStart;\n }\n\n function initTokenState() {\n\ttokCurLine = 1;\n\ttokPos = tokLineStart = 0;\n\ttokRegexpAllowed = true;\n\tskipSpace();\n }\n\n function finishToken(type, val) {\n\ttokEnd = tokPos;\n\tif (options.locations) tokEndLoc = new line_loc_t;\n\ttokType = type;\n\tskipSpace();\n\ttokVal = val;\n\ttokRegexpAllowed = type.beforeExpr;\n }\n\n function skipBlockComment() {\n\tvar startLoc = options.onComment && options.locations && new line_loc_t;\n\tvar start = tokPos, end = input.indexOf(\"*/\", tokPos += 2);\n\tif (end === -1) raise(tokPos - 2, \"Unterminated comment\");\n\ttokPos = end + 2;\n\tif (options.locations) {\n\t lineBreak.lastIndex = start;\n\t var match;\n\t while ((match = lineBreak.exec(input)) && match.index < tokPos) {\n\t\t++tokCurLine;\n\t\ttokLineStart = match.index + match[0].length;\n\t }\n\t}\n\tif (options.onComment)\n\t options.onComment(true, input.slice(start + 2, end), start, tokPos,\n\t\t\t\t\t\tstartLoc, options.locations && new line_loc_t);\n }\n\n function skipLineComment() {\n\tvar start = tokPos;\n\tvar startLoc = options.onComment && options.locations && new line_loc_t;\n\tvar ch = input.charCodeAt(tokPos+=2);\n\twhile (tokPos < inputLen && ch !== 10 && ch !== 13 && ch !== 8232 && ch !== 8233) {\n\t ++tokPos;\n\t ch = input.charCodeAt(tokPos);\n\t}\n\tif (options.onComment)\n\t options.onComment(false, input.slice(start + 2, tokPos), start, tokPos,\n\t\t\t\t\t\tstartLoc, options.locations && new line_loc_t);\n }\n\n function skipSpace() {\n\twhile (tokPos < inputLen) {\n\t var ch = input.charCodeAt(tokPos);\n\t if (ch === 32) {\n\t\t++tokPos;\n\t } else if (ch === 13) {\n\t\t++tokPos;\n\t\tvar next = input.charCodeAt(tokPos);\n\t\tif (next === 10) {\n\t\t ++tokPos;\n\t\t}\n\t\tif (options.locations) {\n\t\t ++tokCurLine;\n\t\t tokLineStart = tokPos;\n\t\t}\n\t } else if (ch === 10 || ch === 8232 || ch === 8233) {\n\t\t++tokPos;\n\t\tif (options.locations) {\n\t\t ++tokCurLine;\n\t\t tokLineStart = tokPos;\n\t\t}\n\t } else if (ch > 8 && ch < 14) {\n\t\t++tokPos;\n\t } else if (ch === 47) {\n\t\tvar next = input.charCodeAt(tokPos + 1);\n\t\tif (next === 42) {\n\t\t skipBlockComment();\n\t\t} else if (next === 47) {\n\t\t skipLineComment();\n\t\t} else break;\n\t } else if (ch === 160) {\n\t\t++tokPos;\n\t } else if (ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) {\n\t\t++tokPos;\n\t } else {\n\t\tbreak;\n\t }\n\t}\n }\n\n function readToken_dot() {\n\tvar next = input.charCodeAt(tokPos + 1);\n\tif (next >= 48 && next <= 57) return readNumber(true);\n\t++tokPos;\n\treturn finishToken(_dot);\n }\n\n function readToken_slash() {\n\tvar next = input.charCodeAt(tokPos + 1);\n\tif (tokRegexpAllowed) {++tokPos; return readRegexp();}\n\tif (next === 61) return finishOp(_assign, 2);\n\treturn finishOp(_slash, 1);\n }\n\n function readToken_mult_modulo() {\n\tvar next = input.charCodeAt(tokPos + 1);\n\tif (next === 61) return finishOp(_assign, 2);\n\treturn finishOp(_multiplyModulo, 1);\n }\n\n function readToken_pipe_amp(code) {\n\tvar next = input.charCodeAt(tokPos + 1);\n\tif (next === code) return finishOp(code === 124 ? _logicalOR : _logicalAND, 2);\n\tif (next === 61) return finishOp(_assign, 2);\n\treturn finishOp(code === 124 ? _bitwiseOR : _bitwiseAND, 1);\n }\n\n function readToken_caret() {\n\tvar next = input.charCodeAt(tokPos + 1);\n\tif (next === 61) return finishOp(_assign, 2);\n\treturn finishOp(_bitwiseXOR, 1);\n }\n\n function readToken_plus_min(code) {\n\tvar next = input.charCodeAt(tokPos + 1);\n\tif (next === code) {\n\t if (next == 45 && input.charCodeAt(tokPos + 2) == 62 &&\n\t\t newline.test(input.slice(lastEnd, tokPos))) {\n\t\ttokPos += 3;\n\t\tskipLineComment();\n\t\tskipSpace();\n\t\treturn readToken();\n\t }\n\t return finishOp(_incDec, 2);\n\t}\n\tif (next === 61) return finishOp(_assign, 2);\n\treturn finishOp(_plusMin, 1);\n }\n\n function readToken_lt_gt(code) {\n\tvar next = input.charCodeAt(tokPos + 1);\n\tvar size = 1;\n\tif (next === code) {\n\t size = code === 62 && input.charCodeAt(tokPos + 2) === 62 ? 3 : 2;\n\t if (input.charCodeAt(tokPos + size) === 61) return finishOp(_assign, size + 1);\n\t return finishOp(_bitShift, size);\n\t}\n\tif (next == 33 && code == 60 && input.charCodeAt(tokPos + 2) == 45 &&\n\t\tinput.charCodeAt(tokPos + 3) == 45) {\n\t tokPos += 4;\n\t skipLineComment();\n\t skipSpace();\n\t return readToken();\n\t}\n\tif (next === 61)\n\t size = input.charCodeAt(tokPos + 2) === 61 ? 3 : 2;\n\treturn finishOp(_relational, size);\n }\n\n function readToken_eq_excl(code) {\n\tvar next = input.charCodeAt(tokPos + 1);\n\tif (next === 61) return finishOp(_equality, input.charCodeAt(tokPos + 2) === 61 ? 3 : 2);\n\treturn finishOp(code === 61 ? _eq : _prefix, 1);\n }\n\n function getTokenFromCode(code) {\n\tswitch(code) {\n\tcase 46:\n\t return readToken_dot();\n\n\tcase 40: ++tokPos; return finishToken(_parenL);\n\tcase 41: ++tokPos; return finishToken(_parenR);\n\tcase 59: ++tokPos; return finishToken(_semi);\n\tcase 44: ++tokPos; return finishToken(_comma);\n\tcase 91: ++tokPos; return finishToken(_bracketL);\n\tcase 93: ++tokPos; return finishToken(_bracketR);\n\tcase 123: ++tokPos; return finishToken(_braceL);\n\tcase 125: ++tokPos; return finishToken(_braceR);\n\tcase 58: ++tokPos; return finishToken(_colon);\n\tcase 63: ++tokPos; return finishToken(_question);\n\n\tcase 48:\n\t var next = input.charCodeAt(tokPos + 1);\n\t if (next === 120 || next === 88) return readHexNumber();\n\tcase 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57:\n\t return readNumber(false);\n\n\tcase 34: case 39:\n\t return readString(code);\n\n\tcase 47:\n\t return readToken_slash(code);\n\n\tcase 37: case 42:\n\t return readToken_mult_modulo();\n\n\tcase 124: case 38:\n\t return readToken_pipe_amp(code);\n\n\tcase 94:\n\t return readToken_caret();\n\n\tcase 43: case 45:\n\t return readToken_plus_min(code);\n\n\tcase 60: case 62:\n\t return readToken_lt_gt(code);\n\n\tcase 61: case 33:\n\t return readToken_eq_excl(code);\n\n\tcase 126:\n\t return finishOp(_prefix, 1);\n\t}\n\n\treturn false;\n }\n\n function readToken(forceRegexp) {\n\tif (!forceRegexp) tokStart = tokPos;\n\telse tokPos = tokStart + 1;\n\tif (options.locations) tokStartLoc = new line_loc_t;\n\tif (forceRegexp) return readRegexp();\n\tif (tokPos >= inputLen) return finishToken(_eof);\n\n\tvar code = input.charCodeAt(tokPos);\n\tif (isIdentifierStart(code) || code === 92 ) return readWord();\n\n\tvar tok = getTokenFromCode(code);\n\n\tif (tok === false) {\n\t var ch = String.fromCharCode(code);\n\t if (ch === \"\\\\\" || nonASCIIidentifierStart.test(ch)) return readWord();\n\t raise(tokPos, \"Unexpected character '\" + ch + \"'\");\n\t}\n\treturn tok;\n }\n\n function finishOp(type, size) {\n\tvar str = input.slice(tokPos, tokPos + size);\n\ttokPos += size;\n\tfinishToken(type, str);\n }\n\n function readRegexp() {\n\tvar content = \"\", escaped, inClass, start = tokPos;\n\tfor (;;) {\n\t if (tokPos >= inputLen) raise(start, \"Unterminated regular expression\");\n\t var ch = input.charAt(tokPos);\n\t if (newline.test(ch)) raise(start, \"Unterminated regular expression\");\n\t if (!escaped) {\n\t\tif (ch === \"[\") inClass = true;\n\t\telse if (ch === \"]\" && inClass) inClass = false;\n\t\telse if (ch === \"/\" && !inClass) break;\n\t\tescaped = ch === \"\\\\\";\n\t } else escaped = false;\n\t ++tokPos;\n\t}\n\tvar content = input.slice(start, tokPos);\n\t++tokPos;\n\tvar mods = readWord1();\n\tif (mods && !/^[gmsiy]*$/.test(mods)) raise(start, \"Invalid regexp flag\");\n\ttry {\n\t var value = new RegExp(content, mods);\n\t} catch (e) {\n\t if (e instanceof SyntaxError) raise(start, e.message);\n\t raise(e);\n\t}\n\treturn finishToken(_regexp, value);\n }\n\n function readInt(radix, len) {\n\tvar start = tokPos, total = 0;\n\tfor (var i = 0, e = len == null ? Infinity : len; i < e; ++i) {\n\t var code = input.charCodeAt(tokPos), val;\n\t if (code >= 97) val = code - 97 + 10;\n\t else if (code >= 65) val = code - 65 + 10;\n\t else if (code >= 48 && code <= 57) val = code - 48;\n\t else val = Infinity;\n\t if (val >= radix) break;\n\t ++tokPos;\n\t total = total * radix + val;\n\t}\n\tif (tokPos === start || len != null && tokPos - start !== len) return null;\n\n\treturn total;\n }\n\n function readHexNumber() {\n\ttokPos += 2;\n\tvar val = readInt(16);\n\tif (val == null) raise(tokStart + 2, \"Expected hexadecimal number\");\n\tif (isIdentifierStart(input.charCodeAt(tokPos))) raise(tokPos, \"Identifier directly after number\");\n\treturn finishToken(_num, val);\n }\n\n function readNumber(startsWithDot) {\n\tvar start = tokPos, isFloat = false, octal = input.charCodeAt(tokPos) === 48;\n\tif (!startsWithDot && readInt(10) === null) raise(start, \"Invalid number\");\n\tif (input.charCodeAt(tokPos) === 46) {\n\t ++tokPos;\n\t readInt(10);\n\t isFloat = true;\n\t}\n\tvar next = input.charCodeAt(tokPos);\n\tif (next === 69 || next === 101) {\n\t next = input.charCodeAt(++tokPos);\n\t if (next === 43 || next === 45) ++tokPos;\n\t if (readInt(10) === null) raise(start, \"Invalid number\");\n\t isFloat = true;\n\t}\n\tif (isIdentifierStart(input.charCodeAt(tokPos))) raise(tokPos, \"Identifier directly after number\");\n\n\tvar str = input.slice(start, tokPos), val;\n\tif (isFloat) val = parseFloat(str);\n\telse if (!octal || str.length === 1) val = parseInt(str, 10);\n\telse if (/[89]/.test(str) || strict) raise(start, \"Invalid number\");\n\telse val = parseInt(str, 8);\n\treturn finishToken(_num, val);\n }\n\n function readString(quote) {\n\ttokPos++;\n\tvar out = \"\";\n\tfor (;;) {\n\t if (tokPos >= inputLen) raise(tokStart, \"Unterminated string constant\");\n\t var ch = input.charCodeAt(tokPos);\n\t if (ch === quote) {\n\t\t++tokPos;\n\t\treturn finishToken(_string, out);\n\t }\n\t if (ch === 92) {\n\t\tch = input.charCodeAt(++tokPos);\n\t\tvar octal = /^[0-7]+/.exec(input.slice(tokPos, tokPos + 3));\n\t\tif (octal) octal = octal[0];\n\t\twhile (octal && parseInt(octal, 8) > 255) octal = octal.slice(0, -1);\n\t\tif (octal === \"0\") octal = null;\n\t\t++tokPos;\n\t\tif (octal) {\n\t\t if (strict) raise(tokPos - 2, \"Octal literal in strict mode\");\n\t\t out += String.fromCharCode(parseInt(octal, 8));\n\t\t tokPos += octal.length - 1;\n\t\t} else {\n\t\t switch (ch) {\n\t\t case 110: out += \"\\n\"; break;\n\t\t case 114: out += \"\\r\"; break;\n\t\t case 120: out += String.fromCharCode(readHexChar(2)); break;\n\t\t case 117: out += String.fromCharCode(readHexChar(4)); break;\n\t\t case 85: out += String.fromCharCode(readHexChar(8)); break;\n\t\t case 116: out += \"\\t\"; break;\n\t\t case 98: out += \"\\b\"; break;\n\t\t case 118: out += \"\\u000b\"; break;\n\t\t case 102: out += \"\\f\"; break;\n\t\t case 48: out += \"\\0\"; break;\n\t\t case 13: if (input.charCodeAt(tokPos) === 10) ++tokPos;\n\t\t case 10:\n\t\t\tif (options.locations) { tokLineStart = tokPos; ++tokCurLine; }\n\t\t\tbreak;\n\t\t default: out += String.fromCharCode(ch); break;\n\t\t }\n\t\t}\n\t } else {\n\t\tif (ch === 13 || ch === 10 || ch === 8232 || ch === 8233) raise(tokStart, \"Unterminated string constant\");\n\t\tout += String.fromCharCode(ch);\n\t\t++tokPos;\n\t }\n\t}\n }\n\n function readHexChar(len) {\n\tvar n = readInt(16, len);\n\tif (n === null) raise(tokStart, \"Bad character escape sequence\");\n\treturn n;\n }\n\n var containsEsc;\n\n function readWord1() {\n\tcontainsEsc = false;\n\tvar word, first = true, start = tokPos;\n\tfor (;;) {\n\t var ch = input.charCodeAt(tokPos);\n\t if (isIdentifierChar(ch)) {\n\t\tif (containsEsc) word += input.charAt(tokPos);\n\t\t++tokPos;\n\t } else if (ch === 92) {\n\t\tif (!containsEsc) word = input.slice(start, tokPos);\n\t\tcontainsEsc = true;\n\t\tif (input.charCodeAt(++tokPos) != 117)\n\t\t raise(tokPos, \"Expecting Unicode escape sequence \\\\uXXXX\");\n\t\t++tokPos;\n\t\tvar esc = readHexChar(4);\n\t\tvar escStr = String.fromCharCode(esc);\n\t\tif (!escStr) raise(tokPos - 1, \"Invalid Unicode escape\");\n\t\tif (!(first ? isIdentifierStart(esc) : isIdentifierChar(esc)))\n\t\t raise(tokPos - 4, \"Invalid Unicode escape\");\n\t\tword += escStr;\n\t } else {\n\t\tbreak;\n\t }\n\t first = false;\n\t}\n\treturn containsEsc ? word : input.slice(start, tokPos);\n }\n\n function readWord() {\n\tvar word = readWord1();\n\tvar type = _name;\n\tif (!containsEsc && isKeyword(word))\n\t type = keywordTypes[word];\n\treturn finishToken(type, word);\n }\n\n function next() {\n\tlastStart = tokStart;\n\tlastEnd = tokEnd;\n\tlastEndLoc = tokEndLoc;\n\treadToken();\n }\n\n function setStrict(strct) {\n\tstrict = strct;\n\ttokPos = tokStart;\n\tif (options.locations) {\n\t while (tokPos < tokLineStart) {\n\t\ttokLineStart = input.lastIndexOf(\"\\n\", tokLineStart - 2) + 1;\n\t\t--tokCurLine;\n\t }\n\t}\n\tskipSpace();\n\treadToken();\n }\n\n function node_t() {\n\tthis.type = null;\n\tthis.start = tokStart;\n\tthis.end = null;\n }\n\n function node_loc_t() {\n\tthis.start = tokStartLoc;\n\tthis.end = null;\n\tif (sourceFile !== null) this.source = sourceFile;\n }\n\n function startNode() {\n\tvar node = new node_t();\n\tif (options.locations)\n\t node.loc = new node_loc_t();\n\tif (options.directSourceFile)\n\t node.sourceFile = options.directSourceFile;\n\tif (options.ranges)\n\t node.range = [tokStart, 0];\n\treturn node;\n }\n\n function startNodeFrom(other) {\n\tvar node = new node_t();\n\tnode.start = other.start;\n\tif (options.locations) {\n\t node.loc = new node_loc_t();\n\t node.loc.start = other.loc.start;\n\t}\n\tif (options.ranges)\n\t node.range = [other.range[0], 0];\n\n\treturn node;\n }\n\n function finishNode(node, type) {\n\tnode.type = type;\n\tnode.end = lastEnd;\n\tif (options.locations)\n\t node.loc.end = lastEndLoc;\n\tif (options.ranges)\n\t node.range[1] = lastEnd;\n\treturn node;\n }\n\n function isUseStrict(stmt) {\n\treturn options.ecmaVersion >= 5 && stmt.type === \"ExpressionStatement\" &&\n\t stmt.expression.type === \"Literal\" && stmt.expression.value === \"use strict\";\n }\n\n function eat(type) {\n\tif (tokType === type) {\n\t next();\n\t return true;\n\t}\n }\n\n function canInsertSemicolon() {\n\treturn !options.strictSemicolons &&\n\t (tokType === _eof || tokType === _braceR || newline.test(input.slice(lastEnd, tokStart)));\n }\n\n function semicolon() {\n\tif (!eat(_semi) && !canInsertSemicolon()) unexpected();\n }\n\n function expect(type) {\n\tif (tokType === type) next();\n\telse unexpected();\n }\n\n function unexpected() {\n\traise(tokStart, \"Unexpected token\");\n }\n\n function checkLVal(expr) {\n\tif (expr.type !== \"Identifier\" && expr.type !== \"MemberExpression\")\n\t raise(expr.start, \"Assigning to rvalue\");\n\tif (strict && expr.type === \"Identifier\" && isStrictBadIdWord(expr.name))\n\t raise(expr.start, \"Assigning to \" + expr.name + \" in strict mode\");\n }\n\n function parseTopLevel(program) {\n\tlastStart = lastEnd = tokPos;\n\tif (options.locations) lastEndLoc = new line_loc_t;\n\tinFunction = strict = null;\n\tlabels = [];\n\treadToken();\n\n\tvar node = program || startNode(), first = true;\n\tif (!program) node.body = [];\n\twhile (tokType !== _eof) {\n\t var stmt = parseStatement();\n\t node.body.push(stmt);\n\t if (first && isUseStrict(stmt)) setStrict(true);\n\t first = false;\n\t}\n\treturn finishNode(node, \"Program\");\n }\n\n var loopLabel = {kind: \"loop\"}, switchLabel = {kind: \"switch\"};\n\n function parseStatement() {\n\tif (tokType === _slash || tokType === _assign && tokVal == \"/=\")\n\t readToken(true);\n\n\tvar starttype = tokType, node = startNode();\n\n\tswitch (starttype) {\n\tcase _break: case _continue:\n\t next();\n\t var isBreak = starttype === _break;\n\t if (eat(_semi) || canInsertSemicolon()) node.label = null;\n\t else if (tokType !== _name) unexpected();\n\t else {\n\t\tnode.label = parseIdent();\n\t\tsemicolon();\n\t }\n\n\t for (var i = 0; i < labels.length; ++i) {\n\t\tvar lab = labels[i];\n\t\tif (node.label == null || lab.name === node.label.name) {\n\t\t if (lab.kind != null && (isBreak || lab.kind === \"loop\")) break;\n\t\t if (node.label && isBreak) break;\n\t\t}\n\t }\n\t if (i === labels.length) raise(node.start, \"Unsyntactic \" + starttype.keyword);\n\t return finishNode(node, isBreak ? \"BreakStatement\" : \"ContinueStatement\");\n\n\tcase _debugger:\n\t next();\n\t semicolon();\n\t return finishNode(node, \"DebuggerStatement\");\n\n\tcase _do:\n\t next();\n\t labels.push(loopLabel);\n\t node.body = parseStatement();\n\t labels.pop();\n\t expect(_while);\n\t node.test = parseParenExpression();\n\t semicolon();\n\t return finishNode(node, \"DoWhileStatement\");\n\n\tcase _for:\n\t next();\n\t labels.push(loopLabel);\n\t expect(_parenL);\n\t if (tokType === _semi) return parseFor(node, null);\n\t if (tokType === _var) {\n\t\tvar init = startNode();\n\t\tnext();\n\t\tparseVar(init, true);\n\t\tfinishNode(init, \"VariableDeclaration\");\n\t\tif (init.declarations.length === 1 && eat(_in))\n\t\t return parseForIn(node, init);\n\t\treturn parseFor(node, init);\n\t }\n\t var init = parseExpression(false, true);\n\t if (eat(_in)) {checkLVal(init); return parseForIn(node, init);}\n\t return parseFor(node, init);\n\n\tcase _function:\n\t next();\n\t return parseFunction(node, true);\n\n\tcase _if:\n\t next();\n\t node.test = parseParenExpression();\n\t node.consequent = parseStatement();\n\t node.alternate = eat(_else) ? parseStatement() : null;\n\t return finishNode(node, \"IfStatement\");\n\n\tcase _return:\n\t if (!inFunction && !options.allowReturnOutsideFunction)\n\t\traise(tokStart, \"'return' outside of function\");\n\t next();\n\n\t if (eat(_semi) || canInsertSemicolon()) node.argument = null;\n\t else { node.argument = parseExpression(); semicolon(); }\n\t return finishNode(node, \"ReturnStatement\");\n\n\tcase _switch:\n\t next();\n\t node.discriminant = parseParenExpression();\n\t node.cases = [];\n\t expect(_braceL);\n\t labels.push(switchLabel);\n\n\t for (var cur, sawDefault; tokType != _braceR;) {\n\t\tif (tokType === _case || tokType === _default) {\n\t\t var isCase = tokType === _case;\n\t\t if (cur) finishNode(cur, \"SwitchCase\");\n\t\t node.cases.push(cur = startNode());\n\t\t cur.consequent = [];\n\t\t next();\n\t\t if (isCase) cur.test = parseExpression();\n\t\t else {\n\t\t\tif (sawDefault) raise(lastStart, \"Multiple default clauses\"); sawDefault = true;\n\t\t\tcur.test = null;\n\t\t }\n\t\t expect(_colon);\n\t\t} else {\n\t\t if (!cur) unexpected();\n\t\t cur.consequent.push(parseStatement());\n\t\t}\n\t }\n\t if (cur) finishNode(cur, \"SwitchCase\");\n\t next();\n\t labels.pop();\n\t return finishNode(node, \"SwitchStatement\");\n\n\tcase _throw:\n\t next();\n\t if (newline.test(input.slice(lastEnd, tokStart)))\n\t\traise(lastEnd, \"Illegal newline after throw\");\n\t node.argument = parseExpression();\n\t semicolon();\n\t return finishNode(node, \"ThrowStatement\");\n\n\tcase _try:\n\t next();\n\t node.block = parseBlock();\n\t node.handler = null;\n\t if (tokType === _catch) {\n\t\tvar clause = startNode();\n\t\tnext();\n\t\texpect(_parenL);\n\t\tclause.param = parseIdent();\n\t\tif (strict && isStrictBadIdWord(clause.param.name))\n\t\t raise(clause.param.start, \"Binding \" + clause.param.name + \" in strict mode\");\n\t\texpect(_parenR);\n\t\tclause.guard = null;\n\t\tclause.body = parseBlock();\n\t\tnode.handler = finishNode(clause, \"CatchClause\");\n\t }\n\t node.guardedHandlers = empty;\n\t node.finalizer = eat(_finally) ? parseBlock() : null;\n\t if (!node.handler && !node.finalizer)\n\t\traise(node.start, \"Missing catch or finally clause\");\n\t return finishNode(node, \"TryStatement\");\n\n\tcase _var:\n\t next();\n\t parseVar(node);\n\t semicolon();\n\t return finishNode(node, \"VariableDeclaration\");\n\n\tcase _while:\n\t next();\n\t node.test = parseParenExpression();\n\t labels.push(loopLabel);\n\t node.body = parseStatement();\n\t labels.pop();\n\t return finishNode(node, \"WhileStatement\");\n\n\tcase _with:\n\t if (strict) raise(tokStart, \"'with' in strict mode\");\n\t next();\n\t node.object = parseParenExpression();\n\t node.body = parseStatement();\n\t return finishNode(node, \"WithStatement\");\n\n\tcase _braceL:\n\t return parseBlock();\n\n\tcase _semi:\n\t next();\n\t return finishNode(node, \"EmptyStatement\");\n\n\tdefault:\n\t var maybeName = tokVal, expr = parseExpression();\n\t if (starttype === _name && expr.type === \"Identifier\" && eat(_colon)) {\n\t\tfor (var i = 0; i < labels.length; ++i)\n\t\t if (labels[i].name === maybeName) raise(expr.start, \"Label '\" + maybeName + \"' is already declared\");\n\t\tvar kind = tokType.isLoop ? \"loop\" : tokType === _switch ? \"switch\" : null;\n\t\tlabels.push({name: maybeName, kind: kind});\n\t\tnode.body = parseStatement();\n\t\tlabels.pop();\n\t\tnode.label = expr;\n\t\treturn finishNode(node, \"LabeledStatement\");\n\t } else {\n\t\tnode.expression = expr;\n\t\tsemicolon();\n\t\treturn finishNode(node, \"ExpressionStatement\");\n\t }\n\t}\n }\n\n function parseParenExpression() {\n\texpect(_parenL);\n\tvar val = parseExpression();\n\texpect(_parenR);\n\treturn val;\n }\n\n function parseBlock(allowStrict) {\n\tvar node = startNode(), first = true, strict = false, oldStrict;\n\tnode.body = [];\n\texpect(_braceL);\n\twhile (!eat(_braceR)) {\n\t var stmt = parseStatement();\n\t node.body.push(stmt);\n\t if (first && allowStrict && isUseStrict(stmt)) {\n\t\toldStrict = strict;\n\t\tsetStrict(strict = true);\n\t }\n\t first = false;\n\t}\n\tif (strict && !oldStrict) setStrict(false);\n\treturn finishNode(node, \"BlockStatement\");\n }\n\n function parseFor(node, init) {\n\tnode.init = init;\n\texpect(_semi);\n\tnode.test = tokType === _semi ? null : parseExpression();\n\texpect(_semi);\n\tnode.update = tokType === _parenR ? null : parseExpression();\n\texpect(_parenR);\n\tnode.body = parseStatement();\n\tlabels.pop();\n\treturn finishNode(node, \"ForStatement\");\n }\n\n function parseForIn(node, init) {\n\tnode.left = init;\n\tnode.right = parseExpression();\n\texpect(_parenR);\n\tnode.body = parseStatement();\n\tlabels.pop();\n\treturn finishNode(node, \"ForInStatement\");\n }\n\n function parseVar(node, noIn) {\n\tnode.declarations = [];\n\tnode.kind = \"var\";\n\tfor (;;) {\n\t var decl = startNode();\n\t decl.id = parseIdent();\n\t if (strict && isStrictBadIdWord(decl.id.name))\n\t\traise(decl.id.start, \"Binding \" + decl.id.name + \" in strict mode\");\n\t decl.init = eat(_eq) ? parseExpression(true, noIn) : null;\n\t node.declarations.push(finishNode(decl, \"VariableDeclarator\"));\n\t if (!eat(_comma)) break;\n\t}\n\treturn node;\n }\n\n function parseExpression(noComma, noIn) {\n\tvar expr = parseMaybeAssign(noIn);\n\tif (!noComma && tokType === _comma) {\n\t var node = startNodeFrom(expr);\n\t node.expressions = [expr];\n\t while (eat(_comma)) node.expressions.push(parseMaybeAssign(noIn));\n\t return finishNode(node, \"SequenceExpression\");\n\t}\n\treturn expr;\n }\n\n function parseMaybeAssign(noIn) {\n\tvar left = parseMaybeConditional(noIn);\n\tif (tokType.isAssign) {\n\t var node = startNodeFrom(left);\n\t node.operator = tokVal;\n\t node.left = left;\n\t next();\n\t node.right = parseMaybeAssign(noIn);\n\t checkLVal(left);\n\t return finishNode(node, \"AssignmentExpression\");\n\t}\n\treturn left;\n }\n\n function parseMaybeConditional(noIn) {\n\tvar expr = parseExprOps(noIn);\n\tif (eat(_question)) {\n\t var node = startNodeFrom(expr);\n\t node.test = expr;\n\t node.consequent = parseExpression(true);\n\t expect(_colon);\n\t node.alternate = parseExpression(true, noIn);\n\t return finishNode(node, \"ConditionalExpression\");\n\t}\n\treturn expr;\n }\n\n function parseExprOps(noIn) {\n\treturn parseExprOp(parseMaybeUnary(), -1, noIn);\n }\n\n function parseExprOp(left, minPrec, noIn) {\n\tvar prec = tokType.binop;\n\tif (prec != null && (!noIn || tokType !== _in)) {\n\t if (prec > minPrec) {\n\t\tvar node = startNodeFrom(left);\n\t\tnode.left = left;\n\t\tnode.operator = tokVal;\n\t\tvar op = tokType;\n\t\tnext();\n\t\tnode.right = parseExprOp(parseMaybeUnary(), prec, noIn);\n\t\tvar exprNode = finishNode(node, (op === _logicalOR || op === _logicalAND) ? \"LogicalExpression\" : \"BinaryExpression\");\n\t\treturn parseExprOp(exprNode, minPrec, noIn);\n\t }\n\t}\n\treturn left;\n }\n\n function parseMaybeUnary() {\n\tif (tokType.prefix) {\n\t var node = startNode(), update = tokType.isUpdate;\n\t node.operator = tokVal;\n\t node.prefix = true;\n\t tokRegexpAllowed = true;\n\t next();\n\t node.argument = parseMaybeUnary();\n\t if (update) checkLVal(node.argument);\n\t else if (strict && node.operator === \"delete\" &&\n\t\t\t node.argument.type === \"Identifier\")\n\t\traise(node.start, \"Deleting local variable in strict mode\");\n\t return finishNode(node, update ? \"UpdateExpression\" : \"UnaryExpression\");\n\t}\n\tvar expr = parseExprSubscripts();\n\twhile (tokType.postfix && !canInsertSemicolon()) {\n\t var node = startNodeFrom(expr);\n\t node.operator = tokVal;\n\t node.prefix = false;\n\t node.argument = expr;\n\t checkLVal(expr);\n\t next();\n\t expr = finishNode(node, \"UpdateExpression\");\n\t}\n\treturn expr;\n }\n\n function parseExprSubscripts() {\n\treturn parseSubscripts(parseExprAtom());\n }\n\n function parseSubscripts(base, noCalls) {\n\tif (eat(_dot)) {\n\t var node = startNodeFrom(base);\n\t node.object = base;\n\t node.property = parseIdent(true);\n\t node.computed = false;\n\t return parseSubscripts(finishNode(node, \"MemberExpression\"), noCalls);\n\t} else if (eat(_bracketL)) {\n\t var node = startNodeFrom(base);\n\t node.object = base;\n\t node.property = parseExpression();\n\t node.computed = true;\n\t expect(_bracketR);\n\t return parseSubscripts(finishNode(node, \"MemberExpression\"), noCalls);\n\t} else if (!noCalls && eat(_parenL)) {\n\t var node = startNodeFrom(base);\n\t node.callee = base;\n\t node.arguments = parseExprList(_parenR, false);\n\t return parseSubscripts(finishNode(node, \"CallExpression\"), noCalls);\n\t} else return base;\n }\n\n function parseExprAtom() {\n\tswitch (tokType) {\n\tcase _this:\n\t var node = startNode();\n\t next();\n\t return finishNode(node, \"ThisExpression\");\n\tcase _name:\n\t return parseIdent();\n\tcase _num: case _string: case _regexp:\n\t var node = startNode();\n\t node.value = tokVal;\n\t node.raw = input.slice(tokStart, tokEnd);\n\t next();\n\t return finishNode(node, \"Literal\");\n\n\tcase _null: case _true: case _false:\n\t var node = startNode();\n\t node.value = tokType.atomValue;\n\t node.raw = tokType.keyword;\n\t next();\n\t return finishNode(node, \"Literal\");\n\n\tcase _parenL:\n\t var tokStartLoc1 = tokStartLoc, tokStart1 = tokStart;\n\t next();\n\t var val = parseExpression();\n\t val.start = tokStart1;\n\t val.end = tokEnd;\n\t if (options.locations) {\n\t\tval.loc.start = tokStartLoc1;\n\t\tval.loc.end = tokEndLoc;\n\t }\n\t if (options.ranges)\n\t\tval.range = [tokStart1, tokEnd];\n\t expect(_parenR);\n\t return val;\n\n\tcase _bracketL:\n\t var node = startNode();\n\t next();\n\t node.elements = parseExprList(_bracketR, true, true);\n\t return finishNode(node, \"ArrayExpression\");\n\n\tcase _braceL:\n\t return parseObj();\n\n\tcase _function:\n\t var node = startNode();\n\t next();\n\t return parseFunction(node, false);\n\n\tcase _new:\n\t return parseNew();\n\n\tdefault:\n\t unexpected();\n\t}\n }\n\n function parseNew() {\n\tvar node = startNode();\n\tnext();\n\tnode.callee = parseSubscripts(parseExprAtom(), true);\n\tif (eat(_parenL)) node.arguments = parseExprList(_parenR, false);\n\telse node.arguments = empty;\n\treturn finishNode(node, \"NewExpression\");\n }\n\n function parseObj() {\n\tvar node = startNode(), first = true, sawGetSet = false;\n\tnode.properties = [];\n\tnext();\n\twhile (!eat(_braceR)) {\n\t if (!first) {\n\t\texpect(_comma);\n\t\tif (options.allowTrailingCommas && eat(_braceR)) break;\n\t } else first = false;\n\n\t var prop = {key: parsePropertyName()}, isGetSet = false, kind;\n\t if (eat(_colon)) {\n\t\tprop.value = parseExpression(true);\n\t\tkind = prop.kind = \"init\";\n\t } else if (options.ecmaVersion >= 5 && prop.key.type === \"Identifier\" &&\n\t\t\t\t (prop.key.name === \"get\" || prop.key.name === \"set\")) {\n\t\tisGetSet = sawGetSet = true;\n\t\tkind = prop.kind = prop.key.name;\n\t\tprop.key = parsePropertyName();\n\t\tif (tokType !== _parenL) unexpected();\n\t\tprop.value = parseFunction(startNode(), false);\n\t } else unexpected();\n\n\t if (prop.key.type === \"Identifier\" && (strict || sawGetSet)) {\n\t\tfor (var i = 0; i < node.properties.length; ++i) {\n\t\t var other = node.properties[i];\n\t\t if (other.key.name === prop.key.name) {\n\t\t\tvar conflict = kind == other.kind || isGetSet && other.kind === \"init\" ||\n\t\t\t kind === \"init\" && (other.kind === \"get\" || other.kind === \"set\");\n\t\t\tif (conflict && !strict && kind === \"init\" && other.kind === \"init\") conflict = false;\n\t\t\tif (conflict) raise(prop.key.start, \"Redefinition of property\");\n\t\t }\n\t\t}\n\t }\n\t node.properties.push(prop);\n\t}\n\treturn finishNode(node, \"ObjectExpression\");\n }\n\n function parsePropertyName() {\n\tif (tokType === _num || tokType === _string) return parseExprAtom();\n\treturn parseIdent(true);\n }\n\n function parseFunction(node, isStatement) {\n\tif (tokType === _name) node.id = parseIdent();\n\telse if (isStatement) unexpected();\n\telse node.id = null;\n\tnode.params = [];\n\tvar first = true;\n\texpect(_parenL);\n\twhile (!eat(_parenR)) {\n\t if (!first) expect(_comma); else first = false;\n\t node.params.push(parseIdent());\n\t}\n\n\tvar oldInFunc = inFunction, oldLabels = labels;\n\tinFunction = true; labels = [];\n\tnode.body = parseBlock(true);\n\tinFunction = oldInFunc; labels = oldLabels;\n\n\tif (strict || node.body.body.length && isUseStrict(node.body.body[0])) {\n\t for (var i = node.id ? -1 : 0; i < node.params.length; ++i) {\n\t\tvar id = i < 0 ? node.id : node.params[i];\n\t\tif (isStrictReservedWord(id.name) || isStrictBadIdWord(id.name))\n\t\t raise(id.start, \"Defining '\" + id.name + \"' in strict mode\");\n\t\tif (i >= 0) for (var j = 0; j < i; ++j) if (id.name === node.params[j].name)\n\t\t raise(id.start, \"Argument name clash in strict mode\");\n\t }\n\t}\n\n\treturn finishNode(node, isStatement ? \"FunctionDeclaration\" : \"FunctionExpression\");\n }\n\n function parseExprList(close, allowTrailingComma, allowEmpty) {\n\tvar elts = [], first = true;\n\twhile (!eat(close)) {\n\t if (!first) {\n\t\texpect(_comma);\n\t\tif (allowTrailingComma && options.allowTrailingCommas && eat(close)) break;\n\t } else first = false;\n\n\t if (allowEmpty && tokType === _comma) elts.push(null);\n\t else elts.push(parseExpression(true));\n\t}\n\treturn elts;\n }\n\n function parseIdent(liberal) {\n\tvar node = startNode();\n\tif (liberal && options.forbidReserved == \"everywhere\") liberal = false;\n\tif (tokType === _name) {\n\t if (!liberal &&\n\t\t (options.forbidReserved &&\n\t\t (options.ecmaVersion === 3 ? isReservedWord3 : isReservedWord5)(tokVal) ||\n\t\t strict && isStrictReservedWord(tokVal)) &&\n\t\t input.slice(tokStart, tokEnd).indexOf(\"\\\\\") == -1)\n\t\traise(tokStart, \"The keyword '\" + tokVal + \"' is reserved\");\n\t node.name = tokVal;\n\t} else if (liberal && tokType.keyword) {\n\t node.name = tokType.keyword;\n\t} else {\n\t unexpected();\n\t}\n\ttokRegexpAllowed = false;\n\tnext();\n\treturn finishNode(node, \"Identifier\");\n }\n\n});\n\n\t\tif (!acorn.version)\n\t\t\tacorn = null;\n\t}\n\n\tfunction parse(code, options) {\n\t\treturn (global.acorn || acorn).parse(code, options);\n\t}\n\n\tvar binaryOperators = {\n\t\t'+': '__add',\n\t\t'-': '__subtract',\n\t\t'*': '__multiply',\n\t\t'/': '__divide',\n\t\t'%': '__modulo',\n\t\t'==': '__equals',\n\t\t'!=': '__equals'\n\t};\n\n\tvar unaryOperators = {\n\t\t'-': '__negate',\n\t\t'+': '__self'\n\t};\n\n\tvar fields = Base.each(\n\t\t['add', 'subtract', 'multiply', 'divide', 'modulo', 'equals', 'negate'],\n\t\tfunction(name) {\n\t\t\tthis['__' + name] = '#' + name;\n\t\t},\n\t\t{\n\t\t\t__self: function() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t);\n\tPoint.inject(fields);\n\tSize.inject(fields);\n\tColor.inject(fields);\n\n\tfunction __$__(left, operator, right) {\n\t\tvar handler = binaryOperators[operator];\n\t\tif (left && left[handler]) {\n\t\t\tvar res = left[handler](right);\n\t\t\treturn operator === '!=' ? !res : res;\n\t\t}\n\t\tswitch (operator) {\n\t\tcase '+': return left + right;\n\t\tcase '-': return left - right;\n\t\tcase '*': return left * right;\n\t\tcase '/': return left / right;\n\t\tcase '%': return left % right;\n\t\tcase '==': return left == right;\n\t\tcase '!=': return left != right;\n\t\t}\n\t}\n\n\tfunction $__(operator, value) {\n\t\tvar handler = unaryOperators[operator];\n\t\tif (value && value[handler])\n\t\t\treturn value[handler]();\n\t\tswitch (operator) {\n\t\tcase '+': return +value;\n\t\tcase '-': return -value;\n\t\t}\n\t}\n\n\tfunction compile(code, options) {\n\t\tif (!code)\n\t\t\treturn '';\n\t\toptions = options || {};\n\n\t\tvar insertions = [];\n\n\t\tfunction getOffset(offset) {\n\t\t\tfor (var i = 0, l = insertions.length; i < l; i++) {\n\t\t\t\tvar insertion = insertions[i];\n\t\t\t\tif (insertion[0] >= offset)\n\t\t\t\t\tbreak;\n\t\t\t\toffset += insertion[1];\n\t\t\t}\n\t\t\treturn offset;\n\t\t}\n\n\t\tfunction getCode(node) {\n\t\t\treturn code.substring(getOffset(node.range[0]),\n\t\t\t\t\tgetOffset(node.range[1]));\n\t\t}\n\n\t\tfunction getBetween(left, right) {\n\t\t\treturn code.substring(getOffset(left.range[1]),\n\t\t\t\t\tgetOffset(right.range[0]));\n\t\t}\n\n\t\tfunction replaceCode(node, str) {\n\t\t\tvar start = getOffset(node.range[0]),\n\t\t\t\tend = getOffset(node.range[1]),\n\t\t\t\tinsert = 0;\n\t\t\tfor (var i = insertions.length - 1; i >= 0; i--) {\n\t\t\t\tif (start > insertions[i][0]) {\n\t\t\t\t\tinsert = i + 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tinsertions.splice(insert, 0, [start, str.length - end + start]);\n\t\t\tcode = code.substring(0, start) + str + code.substring(end);\n\t\t}\n\n\t\tfunction handleOverloading(node, parent) {\n\t\t\tswitch (node.type) {\n\t\t\tcase 'UnaryExpression':\n\t\t\t\tif (node.operator in unaryOperators\n\t\t\t\t\t\t&& node.argument.type !== 'Literal') {\n\t\t\t\t\tvar arg = getCode(node.argument);\n\t\t\t\t\treplaceCode(node, '$__(\"' + node.operator + '\", '\n\t\t\t\t\t\t\t+ arg + ')');\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'BinaryExpression':\n\t\t\t\tif (node.operator in binaryOperators\n\t\t\t\t\t\t&& node.left.type !== 'Literal') {\n\t\t\t\t\tvar left = getCode(node.left),\n\t\t\t\t\t\tright = getCode(node.right),\n\t\t\t\t\t\tbetween = getBetween(node.left, node.right),\n\t\t\t\t\t\toperator = node.operator;\n\t\t\t\t\treplaceCode(node, '__$__(' + left + ','\n\t\t\t\t\t\t\t+ between.replace(new RegExp('\\\\' + operator),\n\t\t\t\t\t\t\t\t'\"' + operator + '\"')\n\t\t\t\t\t\t\t+ ', ' + right + ')');\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'UpdateExpression':\n\t\t\tcase 'AssignmentExpression':\n\t\t\t\tvar parentType = parent && parent.type;\n\t\t\t\tif (!(\n\t\t\t\t\t\tparentType === 'ForStatement'\n\t\t\t\t\t\t|| parentType === 'BinaryExpression'\n\t\t\t\t\t\t\t&& /^[=!<>]/.test(parent.operator)\n\t\t\t\t\t\t|| parentType === 'MemberExpression' && parent.computed\n\t\t\t\t)) {\n\t\t\t\t\tif (node.type === 'UpdateExpression') {\n\t\t\t\t\t\tvar arg = getCode(node.argument),\n\t\t\t\t\t\t\texp = '__$__(' + arg + ', \"' + node.operator[0]\n\t\t\t\t\t\t\t\t\t+ '\", 1)',\n\t\t\t\t\t\t\tstr = arg + ' = ' + exp;\n\t\t\t\t\t\tif (node.prefix) {\n\t\t\t\t\t\t\tstr = '(' + str + ')';\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\tparentType === 'AssignmentExpression' ||\n\t\t\t\t\t\t\tparentType === 'VariableDeclarator' ||\n\t\t\t\t\t\t\tparentType === 'BinaryExpression'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (getCode(parent.left || parent.id) === arg)\n\t\t\t\t\t\t\t\tstr = exp;\n\t\t\t\t\t\t\tstr = arg + '; ' + str;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treplaceCode(node, str);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (/^.=$/.test(node.operator)\n\t\t\t\t\t\t\t\t&& node.left.type !== 'Literal') {\n\t\t\t\t\t\t\tvar left = getCode(node.left),\n\t\t\t\t\t\t\t\tright = getCode(node.right),\n\t\t\t\t\t\t\t\texp = left + ' = __$__(' + left + ', \"'\n\t\t\t\t\t\t\t\t\t+ node.operator[0] + '\", ' + right + ')';\n\t\t\t\t\t\t\treplaceCode(node, /^\\(.*\\)$/.test(getCode(node))\n\t\t\t\t\t\t\t\t\t? '(' + exp + ')' : exp);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfunction handleExports(node) {\n\t\t\tswitch (node.type) {\n\t\t\tcase 'ExportDefaultDeclaration':\n\t\t\t\treplaceCode({\n\t\t\t\t\trange: [node.start, node.declaration.start]\n\t\t\t\t}, 'module.exports = ');\n\t\t\t\tbreak;\n\t\t\tcase 'ExportNamedDeclaration':\n\t\t\t\tvar declaration = node.declaration;\n\t\t\t\tvar specifiers = node.specifiers;\n\t\t\t\tif (declaration) {\n\t\t\t\t\tvar declarations = declaration.declarations;\n\t\t\t\t\tif (declarations) {\n\t\t\t\t\t\tdeclarations.forEach(function(dec) {\n\t\t\t\t\t\t\treplaceCode(dec, 'module.exports.' + getCode(dec));\n\t\t\t\t\t\t});\n\t\t\t\t\t\treplaceCode({\n\t\t\t\t\t\t\trange: [\n\t\t\t\t\t\t\t\tnode.start,\n\t\t\t\t\t\t\t\tdeclaration.start + declaration.kind.length\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}, '');\n\t\t\t\t\t}\n\t\t\t\t} else if (specifiers) {\n\t\t\t\t\tvar exports = specifiers.map(function(specifier) {\n\t\t\t\t\t\tvar name = getCode(specifier);\n\t\t\t\t\t\treturn 'module.exports.' + name + ' = ' + name + '; ';\n\t\t\t\t\t}).join('');\n\t\t\t\t\tif (exports) {\n\t\t\t\t\t\treplaceCode(node, exports);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfunction walkAST(node, parent, paperFeatures) {\n\t\t\tif (node) {\n\t\t\t\tfor (var key in node) {\n\t\t\t\t\tif (key !== 'range' && key !== 'loc') {\n\t\t\t\t\t\tvar value = node[key];\n\t\t\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t\t\tfor (var i = 0, l = value.length; i < l; i++) {\n\t\t\t\t\t\t\t\twalkAST(value[i], node, paperFeatures);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (value && typeof value === 'object') {\n\t\t\t\t\t\t\twalkAST(value, node, paperFeatures);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (paperFeatures.operatorOverloading !== false) {\n\t\t\t\t\thandleOverloading(node, parent);\n\t\t\t\t}\n\t\t\t\tif (paperFeatures.moduleExports !== false) {\n\t\t\t\t\thandleExports(node);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction encodeVLQ(value) {\n\t\t\tvar res = '',\n\t\t\t\tbase64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\t\t\tvalue = (Math.abs(value) << 1) + (value < 0 ? 1 : 0);\n\t\t\twhile (value || !res) {\n\t\t\t\tvar next = value & (32 - 1);\n\t\t\t\tvalue >>= 5;\n\t\t\t\tif (value)\n\t\t\t\t\tnext |= 32;\n\t\t\t\tres += base64[next];\n\t\t\t}\n\t\t\treturn res;\n\t\t}\n\n\t\tvar url = options.url || '',\n\t\t\tsourceMaps = options.sourceMaps,\n\t\t\tpaperFeatures = options.paperFeatures || {},\n\t\t\tsource = options.source || code,\n\t\t\toffset = options.offset || 0,\n\t\t\tagent = paper.agent,\n\t\t\tversion = agent.versionNumber,\n\t\t\toffsetCode = false,\n\t\t\tlineBreaks = /\\r\\n|\\n|\\r/mg,\n\t\t\tmap;\n\t\tif (sourceMaps && (agent.chrome && version >= 30\n\t\t\t\t|| agent.webkit && version >= 537.76\n\t\t\t\t|| agent.firefox && version >= 23\n\t\t\t\t|| agent.node)) {\n\t\t\tif (agent.node) {\n\t\t\t\toffset -= 2;\n\t\t\t} else if (window && url && !window.location.href.indexOf(url)) {\n\t\t\t\tvar html = document.getElementsByTagName('html')[0].innerHTML;\n\t\t\t\toffset = html.substr(0, html.indexOf(code) + 1).match(\n\t\t\t\t\t\tlineBreaks).length + 1;\n\t\t\t}\n\t\t\toffsetCode = offset > 0 && !(\n\t\t\t\t\tagent.chrome && version >= 36 ||\n\t\t\t\t\tagent.safari && version >= 600 ||\n\t\t\t\t\tagent.firefox && version >= 40 ||\n\t\t\t\t\tagent.node);\n\t\t\tvar mappings = ['AA' + encodeVLQ(offsetCode ? 0 : offset) + 'A'];\n\t\t\tmappings.length = (code.match(lineBreaks) || []).length + 1\n\t\t\t\t\t+ (offsetCode ? offset : 0);\n\t\t\tmap = {\n\t\t\t\tversion: 3,\n\t\t\t\tfile: url,\n\t\t\t\tnames:[],\n\t\t\t\tmappings: mappings.join(';AACA'),\n\t\t\t\tsourceRoot: '',\n\t\t\t\tsources: [url],\n\t\t\t\tsourcesContent: [source]\n\t\t\t};\n\t\t}\n\t\tif (\n\t\t\tpaperFeatures.operatorOverloading !== false ||\n\t\t\tpaperFeatures.moduleExports !== false\n\t\t) {\n\t\t\twalkAST(parse(code, {\n\t\t\t\tranges: true,\n\t\t\t\tpreserveParens: true,\n\t\t\t\tsourceType: 'module'\n\t\t\t}), null, paperFeatures);\n\t\t}\n\t\tif (map) {\n\t\t\tif (offsetCode) {\n\t\t\t\tcode = new Array(offset + 1).join('\\n') + code;\n\t\t\t}\n\t\t\tif (/^(inline|both)$/.test(sourceMaps)) {\n\t\t\t\tcode += \"\\n//# sourceMappingURL=data:application/json;base64,\"\n\t\t\t\t\t\t+ self.btoa(unescape(encodeURIComponent(\n\t\t\t\t\t\t\tJSON.stringify(map))));\n\t\t\t}\n\t\t\tcode += \"\\n//# sourceURL=\" + (url || 'paperscript');\n\t\t}\n\t\treturn {\n\t\t\turl: url,\n\t\t\tsource: source,\n\t\t\tcode: code,\n\t\t\tmap: map\n\t\t};\n\t}\n\n\tfunction execute(code, scope, options) {\n\t\tpaper = scope;\n\t\tvar view = scope.getView(),\n\t\t\ttool = /\\btool\\.\\w+|\\s+on(?:Key|Mouse)(?:Up|Down|Move|Drag)\\b/\n\t\t\t\t\t.test(code) && !/\\bnew\\s+Tool\\b/.test(code)\n\t\t\t\t\t\t? new Tool() : null,\n\t\t\ttoolHandlers = tool ? tool._events : [],\n\t\t\thandlers = ['onFrame', 'onResize'].concat(toolHandlers),\n\t\t\tparams = [],\n\t\t\targs = [],\n\t\t\tfunc,\n\t\t\tcompiled = typeof code === 'object' ? code : compile(code, options);\n\t\tcode = compiled.code;\n\t\tfunction expose(scope, hidden) {\n\t\t\tfor (var key in scope) {\n\t\t\t\tif ((hidden || !/^_/.test(key)) && new RegExp('([\\\\b\\\\s\\\\W]|^)'\n\t\t\t\t\t\t+ key.replace(/\\$/g, '\\\\$') + '\\\\b').test(code)) {\n\t\t\t\t\tparams.push(key);\n\t\t\t\t\targs.push(scope[key]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\texpose({ __$__: __$__, $__: $__, paper: scope, tool: tool },\n\t\t\t\ttrue);\n\t\texpose(scope);\n\t\tcode = 'var module = { exports: {} }; ' + code;\n\t\tvar exports = Base.each(handlers, function(key) {\n\t\t\tif (new RegExp('\\\\s+' + key + '\\\\b').test(code)) {\n\t\t\t\tparams.push(key);\n\t\t\t\tthis.push('module.exports.' + key + ' = ' + key + ';');\n\t\t\t}\n\t\t}, []).join('\\n');\n\t\tif (exports) {\n\t\t\tcode += '\\n' + exports;\n\t\t}\n\t\tcode += '\\nreturn module.exports;';\n\t\tvar agent = paper.agent;\n\t\tif (document && (agent.chrome\n\t\t\t\t|| agent.firefox && agent.versionNumber < 40)) {\n\t\t\tvar script = document.createElement('script'),\n\t\t\t\thead = document.head || document.getElementsByTagName('head')[0];\n\t\t\tif (agent.firefox)\n\t\t\t\tcode = '\\n' + code;\n\t\t\tscript.appendChild(document.createTextNode(\n\t\t\t\t'document.__paperscript__ = function(' + params + ') {' +\n\t\t\t\t\tcode +\n\t\t\t\t'\\n}'\n\t\t\t));\n\t\t\thead.appendChild(script);\n\t\t\tfunc = document.__paperscript__;\n\t\t\tdelete document.__paperscript__;\n\t\t\thead.removeChild(script);\n\t\t} else {\n\t\t\tfunc = Function(params, code);\n\t\t}\n\t\tvar exports = func && func.apply(scope, args);\n\t\tvar obj = exports || {};\n\t\tBase.each(toolHandlers, function(key) {\n\t\t\tvar value = obj[key];\n\t\t\tif (value)\n\t\t\t\ttool[key] = value;\n\t\t});\n\t\tif (view) {\n\t\t\tif (obj.onResize)\n\t\t\t\tview.setOnResize(obj.onResize);\n\t\t\tview.emit('resize', {\n\t\t\t\tsize: view.size,\n\t\t\t\tdelta: new Point()\n\t\t\t});\n\t\t\tif (obj.onFrame)\n\t\t\t\tview.setOnFrame(obj.onFrame);\n\t\t\tview.requestUpdate();\n\t\t}\n\t\treturn exports;\n\t}\n\n\tfunction loadScript(script) {\n\t\tif (/^text\\/(?:x-|)paperscript$/.test(script.type)\n\t\t\t\t&& PaperScope.getAttribute(script, 'ignore') !== 'true') {\n\t\t\tvar canvasId = PaperScope.getAttribute(script, 'canvas'),\n\t\t\t\tcanvas = document.getElementById(canvasId),\n\t\t\t\tsrc = script.src || script.getAttribute('data-src'),\n\t\t\t\tasync = PaperScope.hasAttribute(script, 'async'),\n\t\t\t\tscopeAttribute = 'data-paper-scope';\n\t\t\tif (!canvas)\n\t\t\t\tthrow new Error('Unable to find canvas with id \"'\n\t\t\t\t\t\t+ canvasId + '\"');\n\t\t\tvar scope = PaperScope.get(canvas.getAttribute(scopeAttribute))\n\t\t\t\t\t\t|| new PaperScope().setup(canvas);\n\t\t\tcanvas.setAttribute(scopeAttribute, scope._id);\n\t\t\tif (src) {\n\t\t\t\tHttp.request({\n\t\t\t\t\turl: src,\n\t\t\t\t\tasync: async,\n\t\t\t\t\tmimeType: 'text/plain',\n\t\t\t\t\tonLoad: function(code) {\n\t\t\t\t\t\texecute(code, scope, src);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\texecute(script.innerHTML, scope, script.baseURI);\n\t\t\t}\n\t\t\tscript.setAttribute('data-paper-ignore', 'true');\n\t\t\treturn scope;\n\t\t}\n\t}\n\n\tfunction loadAll() {\n\t\tBase.each(document && document.getElementsByTagName('script'),\n\t\t\t\tloadScript);\n\t}\n\n\tfunction load(script) {\n\t\treturn script ? loadScript(script) : loadAll();\n\t}\n\n\tif (window) {\n\t\tif (document.readyState === 'complete') {\n\t\t\tsetTimeout(loadAll);\n\t\t} else {\n\t\t\tDomEvent.add(window, { load: loadAll });\n\t\t}\n\t}\n\n\treturn {\n\t\tcompile: compile,\n\t\texecute: execute,\n\t\tload: load,\n\t\tparse: parse,\n\t\tcalculateBinary: __$__,\n\t\tcalculateUnary: $__\n\t};\n\n}.call(this);\n\nvar paper = new (PaperScope.inject(Base.exports, {\n\tBase: Base,\n\tNumerical: Numerical,\n\tKey: Key,\n\tDomEvent: DomEvent,\n\tDomElement: DomElement,\n\tdocument: document,\n\twindow: window,\n\tSymbol: SymbolDefinition,\n\tPlacedSymbol: SymbolItem\n}))();\n\nif (paper.agent.node) {\n\trequire('./node/extend.js')(paper);\n}\n\nif (typeof define === 'function' && define.amd) {\n\tdefine('paper', paper);\n} else if (typeof module === 'object' && module) {\n\tmodule.exports = paper;\n}\n\nreturn paper;\n}.call(this, typeof self === 'object' ? self : null);\n","<template>\n <div data-viewable=\"CalculateSupplementaryAngle\">\n <h2>What is the measurement of the highlighted angle?</h2>\n <canvas ref=\"canvasRef\" width=\"300\" height=\"300\"> </canvas>\n <br />\n <user-input-number v-model=\"answer\" />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, onMounted, onBeforeUnmount, PropType } from 'vue';\nimport { UserInputNumber, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { SupplementaryAngles } from './index';\nimport { randomInt, cos, sin } from '../../utility';\nimport paper from 'paper';\nimport { ViewData } from '@vue-skuilder/common';\nimport { nextTick } from 'vue';\n\nexport default defineComponent({\n name: 'CalculateSupplementaryAngle',\n\n components: {\n UserInputNumber,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'CalculateSupplementaryAngle');\n const questionUtils = useQuestionView<SupplementaryAngles>(viewableUtils);\n\n const answer = ref('');\n const canvasRef = ref<HTMLCanvasElement | null>(null);\n const paperScope = ref<paper.PaperScope>();\n\n // Initialize question immediately\n questionUtils.question.value = new SupplementaryAngles(props.data);\n\n const getBisectingPoint = (\n p: paper.PaperScope,\n width: number,\n baseAngle: number,\n firstAngle: number,\n secondAngle: number,\n height: number,\n scale: number = 30\n ): paper.Point => {\n return new p.Point(\n width / 2 + scale * cos(baseAngle + (firstAngle + secondAngle) / 2),\n height / 2 + scale * sin(baseAngle + (firstAngle + secondAngle) / 2)\n );\n };\n\n onMounted(async () => {\n await nextTick();\n if (!canvasRef.value) return;\n\n paperScope.value = new paper.PaperScope();\n paperScope.value.setup(canvasRef.value);\n const p = paperScope.value;\n\n const width = canvasRef.value.width;\n const height = canvasRef.value.height;\n\n const baseAngle = randomInt(0, 360);\n\n const xOffset = width * cos(baseAngle);\n const yOffset = width * sin(baseAngle);\n\n const baseLine = new p.Path.Line({\n from: new p.Point(width / 2 + xOffset, height / 2 + yOffset),\n to: new p.Point(width / 2 - xOffset, height / 2 - yOffset),\n });\n baseLine.strokeColor = new paper.Color('black');\n\n let sum: number = 0;\n const armPaths: paper.Path[] = [];\n\n if (!questionUtils.question.value) return;\n\n for (let i = 0; i < questionUtils.question.value.angles.length; i++) {\n const currentAngle = questionUtils.question.value.angles[i];\n sum += currentAngle;\n\n console.log(`drawing angle ${i}:\n angle: ${currentAngle}\n angleSum: ${sum}\n `);\n\n let nextArm: number;\n const thisArm: number = sum - currentAngle;\n if (i === questionUtils.question.value.angles.length - 1) {\n nextArm = 180;\n } else {\n nextArm = sum;\n }\n\n const firstArm: paper.Point = new p.Point(\n width / 2 + 30 * cos(baseAngle + thisArm),\n height / 2 + 30 * sin(baseAngle + thisArm)\n );\n const middleArm: paper.Point = getBisectingPoint(p, width, baseAngle, thisArm, nextArm, height);\n const secondArm: paper.Point = new p.Point(\n width / 2 + 30 * cos(baseAngle + nextArm),\n height / 2 + 30 * sin(baseAngle + nextArm)\n );\n\n const xOff = width * cos(baseAngle + sum);\n const yOff = width * sin(baseAngle + sum);\n\n const angleLine = new p.Path.Line({\n from: new p.Point(width / 2, height / 2),\n to: new p.Point(width / 2 + xOff, height / 2 + yOff),\n });\n angleLine.strokeColor = new paper.Color(0, 0, 0);\n armPaths.push(angleLine);\n\n if (questionUtils.question.value.targetAngleIndex === i) {\n console.log(`drawing targetAngle at i = ${i}:\n baseAngle: ${baseAngle}\n targetAngle: ${currentAngle}\n sum: ${sum}\n nextAngle: ${nextArm}\n `);\n\n const fill = new paper.Color(0.1, 0.5, 0.8, 0.35);\n\n const arc = new p.Path.Arc({\n from: firstArm,\n through: middleArm,\n to: secondArm,\n });\n arc.strokeColor = new paper.Color(0.1, 0.5, 0.8, 0.75);\n arc.strokeWidth = 3;\n arc.fillColor = fill;\n\n const triangle = new p.Path();\n triangle.closed = true;\n triangle.add(firstArm);\n triangle.add(new paper.Point(width / 2, height / 2));\n triangle.add(secondArm);\n triangle.fillColor = fill;\n } else {\n const measure = new paper.PointText(middleArm);\n measure.content = currentAngle.toString() + '°';\n\n let intersection: boolean = true;\n let scale: number = 20;\n\n while (intersection) {\n intersection = false;\n measure.bounds!.center = getBisectingPoint(p, width, baseAngle, thisArm, nextArm, height, scale);\n armPaths.forEach((path) => {\n if (path.intersects(measure)) {\n intersection = true;\n }\n });\n scale += 7;\n }\n }\n }\n });\n\n onBeforeUnmount(() => {\n paperScope.value = undefined;\n });\n\n return {\n answer,\n canvasRef,\n ...viewableUtils,\n ...questionUtils,\n };\n },\n});\n</script>\n\n<style lang=\"css\" scoped>\ncanvas {\n display: block;\n margin-left: auto;\n margin-right: auto;\n padding: 10px;\n}\n</style>\n","<template>\n <div data-viewable=\"CalculateSupplementaryAngle\">\n <h2>What is the measurement of the highlighted angle?</h2>\n <canvas ref=\"canvasRef\" width=\"300\" height=\"300\"> </canvas>\n <br />\n <user-input-number v-model=\"answer\" />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, onMounted, onBeforeUnmount, PropType } from 'vue';\nimport { UserInputNumber, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { SupplementaryAngles } from './index';\nimport { randomInt, cos, sin } from '../../utility';\nimport paper from 'paper';\nimport { ViewData } from '@vue-skuilder/common';\nimport { nextTick } from 'vue';\n\nexport default defineComponent({\n name: 'CalculateSupplementaryAngle',\n\n components: {\n UserInputNumber,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'CalculateSupplementaryAngle');\n const questionUtils = useQuestionView<SupplementaryAngles>(viewableUtils);\n\n const answer = ref('');\n const canvasRef = ref<HTMLCanvasElement | null>(null);\n const paperScope = ref<paper.PaperScope>();\n\n // Initialize question immediately\n questionUtils.question.value = new SupplementaryAngles(props.data);\n\n const getBisectingPoint = (\n p: paper.PaperScope,\n width: number,\n baseAngle: number,\n firstAngle: number,\n secondAngle: number,\n height: number,\n scale: number = 30\n ): paper.Point => {\n return new p.Point(\n width / 2 + scale * cos(baseAngle + (firstAngle + secondAngle) / 2),\n height / 2 + scale * sin(baseAngle + (firstAngle + secondAngle) / 2)\n );\n };\n\n onMounted(async () => {\n await nextTick();\n if (!canvasRef.value) return;\n\n paperScope.value = new paper.PaperScope();\n paperScope.value.setup(canvasRef.value);\n const p = paperScope.value;\n\n const width = canvasRef.value.width;\n const height = canvasRef.value.height;\n\n const baseAngle = randomInt(0, 360);\n\n const xOffset = width * cos(baseAngle);\n const yOffset = width * sin(baseAngle);\n\n const baseLine = new p.Path.Line({\n from: new p.Point(width / 2 + xOffset, height / 2 + yOffset),\n to: new p.Point(width / 2 - xOffset, height / 2 - yOffset),\n });\n baseLine.strokeColor = new paper.Color('black');\n\n let sum: number = 0;\n const armPaths: paper.Path[] = [];\n\n if (!questionUtils.question.value) return;\n\n for (let i = 0; i < questionUtils.question.value.angles.length; i++) {\n const currentAngle = questionUtils.question.value.angles[i];\n sum += currentAngle;\n\n console.log(`drawing angle ${i}:\n angle: ${currentAngle}\n angleSum: ${sum}\n `);\n\n let nextArm: number;\n const thisArm: number = sum - currentAngle;\n if (i === questionUtils.question.value.angles.length - 1) {\n nextArm = 180;\n } else {\n nextArm = sum;\n }\n\n const firstArm: paper.Point = new p.Point(\n width / 2 + 30 * cos(baseAngle + thisArm),\n height / 2 + 30 * sin(baseAngle + thisArm)\n );\n const middleArm: paper.Point = getBisectingPoint(p, width, baseAngle, thisArm, nextArm, height);\n const secondArm: paper.Point = new p.Point(\n width / 2 + 30 * cos(baseAngle + nextArm),\n height / 2 + 30 * sin(baseAngle + nextArm)\n );\n\n const xOff = width * cos(baseAngle + sum);\n const yOff = width * sin(baseAngle + sum);\n\n const angleLine = new p.Path.Line({\n from: new p.Point(width / 2, height / 2),\n to: new p.Point(width / 2 + xOff, height / 2 + yOff),\n });\n angleLine.strokeColor = new paper.Color(0, 0, 0);\n armPaths.push(angleLine);\n\n if (questionUtils.question.value.targetAngleIndex === i) {\n console.log(`drawing targetAngle at i = ${i}:\n baseAngle: ${baseAngle}\n targetAngle: ${currentAngle}\n sum: ${sum}\n nextAngle: ${nextArm}\n `);\n\n const fill = new paper.Color(0.1, 0.5, 0.8, 0.35);\n\n const arc = new p.Path.Arc({\n from: firstArm,\n through: middleArm,\n to: secondArm,\n });\n arc.strokeColor = new paper.Color(0.1, 0.5, 0.8, 0.75);\n arc.strokeWidth = 3;\n arc.fillColor = fill;\n\n const triangle = new p.Path();\n triangle.closed = true;\n triangle.add(firstArm);\n triangle.add(new paper.Point(width / 2, height / 2));\n triangle.add(secondArm);\n triangle.fillColor = fill;\n } else {\n const measure = new paper.PointText(middleArm);\n measure.content = currentAngle.toString() + '°';\n\n let intersection: boolean = true;\n let scale: number = 20;\n\n while (intersection) {\n intersection = false;\n measure.bounds!.center = getBisectingPoint(p, width, baseAngle, thisArm, nextArm, height, scale);\n armPaths.forEach((path) => {\n if (path.intersects(measure)) {\n intersection = true;\n }\n });\n scale += 7;\n }\n }\n }\n });\n\n onBeforeUnmount(() => {\n paperScope.value = undefined;\n });\n\n return {\n answer,\n canvasRef,\n ...viewableUtils,\n ...questionUtils,\n };\n },\n});\n</script>\n\n<style lang=\"css\" scoped>\ncanvas {\n display: block;\n margin-left: auto;\n margin-right: auto;\n padding: 10px;\n}\n</style>\n","import { Question } from '@vue-skuilder/common-ui';\nimport {\n Answer,\n FieldDefinition,\n ViewData,\n DataShapeName,\n FieldType,\n Status,\n} from '@vue-skuilder/common';\nimport CalculateSupplementaryAngles from './supplementaryAngles.vue';\nimport { randomInt } from '../../utility';\n\nconst validator = {\n instructions: 'Must be 2 or 3.',\n test: (value: string) => {\n if (value === '2' || value === '3') {\n return {\n status: Status.ok,\n msg: '',\n };\n } else {\n return {\n status: Status.error,\n msg: 'Must be 2 or 3.',\n };\n }\n },\n};\n\nconst fields: FieldDefinition[] = [\n {\n name: 'AngleCount',\n type: FieldType.INT,\n validator,\n },\n];\n\nexport class SupplementaryAngles extends Question {\n public static dataShapes = [\n {\n name: DataShapeName.MATH_SupplimentaryAngles,\n fields,\n },\n ];\n\n public static views = [CalculateSupplementaryAngles];\n\n public angles: number[] = [];\n public targetAngleIndex: number;\n public angleCount: number;\n\n constructor(data: ViewData[]) {\n super(data);\n this.angleCount = data[0].AngleCount as number;\n let sum: number = 0;\n for (let i = 0; i <= this.angleCount - 2; i++) {\n const newAng = randomInt(25, 180 - 25 - sum);\n this.angles.push(newAng);\n sum += newAng;\n }\n this.angles.push(180 - sum);\n this.targetAngleIndex = randomInt(0, this.angleCount - 1);\n }\n\n public isCorrect(userAnswer: Answer) {\n return this.angles[this.targetAngleIndex] === userAnswer;\n }\n\n public dataShapes() {\n return SupplementaryAngles.dataShapes;\n }\n\n public views() {\n return SupplementaryAngles.views;\n }\n}\n","<template>\n <div data-viewable=\"VerbalAddition\" class=\"text-h5\">\n <div class=\"text-h5\">\n Count by <strong>{{ question?.n }}</strong\n >s:\n </div>\n\n <input type=\"text\" disabled class=\"correct\" :value=\"question.answer[0] - question.n\" />,\n\n <span v-for=\"(a, i) in question.answer\" :key=\"i\">\n <input\n :id=\"`input${i}`\"\n :ref=\"`input${i}`\"\n :class=\"`input${a}${i}`\"\n v-model=\"answer[i]\"\n type=\"text\"\n :autofocus=\"i === 0\"\n @keyup=\"track(i)\"\n />\n <span v-if=\"i !== question.answer.length - 1\">, </span>\n </span>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType, onMounted } from 'vue';\nimport { CountBy } from './index';\nimport { useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'VerbalAddition',\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'VerbalAddition');\n const questionUtils = useQuestionView<CountBy>(viewableUtils);\n\n const answer = ref<string[]>(['', '', '', '', '']);\n\n // Initialize question immediately\n questionUtils.question.value = new CountBy(props.data);\n\n // Expose the question directly for template access\n const question = computed(() =>\n questionUtils.question.value ? questionUtils.question.value : new CountBy(props.data)\n );\n\n const track = (n: number): void => {\n console.log(`change in ${n}!\n userAnswer: ${answer.value.toString()}\\n\n qAnswer: ${question.value?.answer.toString()}`);\n\n if (question.value && question.value.answer[n].toString().length === answer.value[n].length) {\n if (parseInt(answer.value[n]) === question.value.answer[n]) {\n document.getElementById('input' + n)?.classList.add('correct');\n document.getElementById('input' + n)?.classList.remove('incorrect');\n document.getElementById('input' + n)?.setAttribute('disabled', 'true');\n\n if (n + 1 < answer.value.length) {\n document.getElementById('input' + (n + 1))?.focus();\n } else {\n questionUtils.submitAnswer(answer.value);\n }\n } else {\n document.getElementById('input' + n)?.classList.add('incorrect');\n questionUtils.submitAnswer(answer.value);\n console.log(`Wrong! ${answer.value[n]} !== ${question.value.answer[n]}`);\n }\n }\n };\n\n onMounted(() => {\n console.log('focusing...');\n document.getElementById('input0')?.focus();\n });\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n track,\n };\n },\n});\n</script>\n\n<style scoped>\ninput {\n width: 3em;\n /* border: black; */\n border-style: solid;\n border-bottom-color: black;\n border-width: 1px;\n text-align: center;\n /* background-color: red; */\n}\n\n.incorrect {\n box-shadow: 0px 0px 5px 0px rgb(180, 0, 95);\n}\n.correct {\n box-shadow: 0px 0px 5px 0px green;\n}\n</style>\n","<template>\n <div data-viewable=\"VerbalAddition\" class=\"text-h5\">\n <div class=\"text-h5\">\n Count by <strong>{{ question?.n }}</strong\n >s:\n </div>\n\n <input type=\"text\" disabled class=\"correct\" :value=\"question.answer[0] - question.n\" />,\n\n <span v-for=\"(a, i) in question.answer\" :key=\"i\">\n <input\n :id=\"`input${i}`\"\n :ref=\"`input${i}`\"\n :class=\"`input${a}${i}`\"\n v-model=\"answer[i]\"\n type=\"text\"\n :autofocus=\"i === 0\"\n @keyup=\"track(i)\"\n />\n <span v-if=\"i !== question.answer.length - 1\">, </span>\n </span>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType, onMounted } from 'vue';\nimport { CountBy } from './index';\nimport { useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\n\nexport default defineComponent({\n name: 'VerbalAddition',\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'VerbalAddition');\n const questionUtils = useQuestionView<CountBy>(viewableUtils);\n\n const answer = ref<string[]>(['', '', '', '', '']);\n\n // Initialize question immediately\n questionUtils.question.value = new CountBy(props.data);\n\n // Expose the question directly for template access\n const question = computed(() =>\n questionUtils.question.value ? questionUtils.question.value : new CountBy(props.data)\n );\n\n const track = (n: number): void => {\n console.log(`change in ${n}!\n userAnswer: ${answer.value.toString()}\\n\n qAnswer: ${question.value?.answer.toString()}`);\n\n if (question.value && question.value.answer[n].toString().length === answer.value[n].length) {\n if (parseInt(answer.value[n]) === question.value.answer[n]) {\n document.getElementById('input' + n)?.classList.add('correct');\n document.getElementById('input' + n)?.classList.remove('incorrect');\n document.getElementById('input' + n)?.setAttribute('disabled', 'true');\n\n if (n + 1 < answer.value.length) {\n document.getElementById('input' + (n + 1))?.focus();\n } else {\n questionUtils.submitAnswer(answer.value);\n }\n } else {\n document.getElementById('input' + n)?.classList.add('incorrect');\n questionUtils.submitAnswer(answer.value);\n console.log(`Wrong! ${answer.value[n]} !== ${question.value.answer[n]}`);\n }\n }\n };\n\n onMounted(() => {\n console.log('focusing...');\n document.getElementById('input0')?.focus();\n });\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n track,\n };\n },\n});\n</script>\n\n<style scoped>\ninput {\n width: 3em;\n /* border: black; */\n border-style: solid;\n border-bottom-color: black;\n border-width: 1px;\n text-align: center;\n /* background-color: red; */\n}\n\n.incorrect {\n box-shadow: 0px 0px 5px 0px rgb(180, 0, 95);\n}\n.correct {\n box-shadow: 0px 0px 5px 0px green;\n}\n</style>\n","import {\n Answer,\n FieldDefinition,\n ViewData,\n DataShapeName,\n FieldType,\n Status,\n} from '@vue-skuilder/common';\nimport { Question } from '@vue-skuilder/common-ui';\n\nimport defaultView from './default.vue';\n\ninterface A extends Answer {\n [index: number]: number;\n}\nenum Hands {\n LEFT = 'LEFT',\n RIGHT = 'RIGHT',\n}\n\nconst fields: FieldDefinition[] = [\n {\n name: 'n',\n type: FieldType.INT,\n },\n {\n name: 'hand',\n type: FieldType.STRING,\n validator: {\n test: (h) => {\n if (h === Hands.LEFT || h === Hands.RIGHT) {\n return {\n status: Status.ok,\n msg: '',\n };\n } else {\n return {\n status: Status.error,\n msg: `Hand must be ${Hands.LEFT} or ${Hands.RIGHT}`,\n };\n }\n },\n },\n },\n];\n\nconst data = function () {\n const ret: { n: number; hand: Hands }[] = [];\n for (let i = 2; i <= 10; i++) {\n ret.push({ n: i, hand: Hands.LEFT });\n ret.push({ n: i, hand: Hands.RIGHT });\n }\n return ret;\n};\n\nfunction asInt(n: number | string): number {\n if (typeof n === 'string') {\n return parseInt(n);\n } else {\n return n;\n }\n}\n\nexport class CountBy extends Question {\n public static dataShapes = [\n {\n name: DataShapeName.MATH_CountBy,\n fields,\n },\n ];\n\n public static views = [defaultView];\n\n public n: number;\n public hand: Hands;\n\n public static seedData = data();\n public static acceptsUserData = false;\n\n constructor(data: ViewData[]) {\n super(data);\n this.n = data[0].n as number;\n this.hand = data[0].hand as Hands;\n }\n\n public get answer(): number[] {\n const soln: number[] = [];\n const start: number = this.hand === Hands.LEFT ? this.n : 6 * this.n;\n for (let i = 0; i < 5; i++) {\n soln.push(start + i * this.n);\n }\n return soln;\n }\n\n public isCorrect(answer: A) {\n console.log(`Solution: ${this.answer.toString()}`);\n\n for (let i = 0; i < this.answer.length; i++) {\n if (asInt(answer[i]) !== this.answer[i]) {\n console.log(`answer[${i}] == ${answer[i]} !== ${this.answer[i]}`);\n\n return false;\n }\n }\n\n return true;\n }\n\n public dataShapes() {\n return CountBy.dataShapes;\n }\n\n public views() {\n return CountBy.views;\n }\n}\n","import { CourseWare } from '../CourseWare';\nimport { SingleDigitAdditionQuestion } from './questions/addition';\nimport { SingleDigitDivisionQuestion } from './questions/division';\nimport { SingleDigitMultiplicationQuestion } from './questions/multiplication';\nimport { EqualityTest } from './questions/equalityTest';\nimport { OneStepEquation } from './questions/oneStepEqn';\nimport { AngleCategorize } from './questions/angleCategorize';\nimport { SupplementaryAngles } from './questions/supplementaryAngles';\nimport { CountBy } from './questions/countBy';\n\nconst math: CourseWare = new CourseWare('math', [\n SingleDigitDivisionQuestion,\n SingleDigitMultiplicationQuestion,\n SingleDigitAdditionQuestion,\n EqualityTest,\n OneStepEquation,\n AngleCategorize,\n SupplementaryAngles,\n CountBy,\n]);\n\nexport default math;\n"],"x_google_ignoreList":[23,24],"mappings":"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,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,IAAK,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,IAAK,GAAI,IAAK,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,IAAK,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,IAAK,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,IAAK,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,KAAM,GAAI,GAAI,KAAM,GAAI,EAAG,GAAI,KAAM,EAAG,IAAK,KAAM,GAAI,KAAM,IAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,KAAM,EAAG,KAAM,GAAI,EAAG,KAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,IAAK,KAAM,IAAK,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,KAAM,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,KAAM,GAAI,EAAG,EAAG,IAAK,GAAI,IAAK,GAAI,GAAI,EAAG,GAAI,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,IAAK,GAAI,GAAI,EAAG,EAAG,KAAM,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG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"}
|